Mysql事務、MySQl事務隔離級別、MySQL事務語法

  1. Mysql事務
  2. 事務的簡介
  3. 爲什麼需要事務

現在的很多軟件都是多用戶,多程序,多線程的,對同一個表可能同時有很多人在用,爲保持數據的一致性,所以提出了事務的概念。

 

A 給B 要劃錢,A 的賬戶-1000元, B 的賬戶就要+1000元,這兩個update 語句必須作爲一個整體來執行,不然A 扣錢了,B 沒有加錢這種情況很難處理。

 

  1. 什麼存儲引擎支持事務

1.查看數據庫下面是否支持事務(InnoDB支持)?

  show engines;

2.查看mysql當前默認的存儲引擎?

  show c'relike '%storage_engine%';

3.查看某張表的存儲引擎?

  show create table 表名 ;

4.對於表的存儲結構的修改?

建立InnoDB 表:Create table .... type=InnoDB; Alter table table_name type=InnoDB;

 

  1. 事務的特性

事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱爲ACID特性。

原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。

一致性(consistency)。事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。

隔離性(isolation)。一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。

持久性(durability)。持久性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

 

1.1.1.3.1. 原子性(atomicity)

一個事務必須被視爲一個不可分割的最小單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗,對於一個事務來說,不可能只執行其中的一部分操作

 

比如: 老婆大人給Deer老師發生活費

1.老婆大人工資卡扣除500元

2.Deer老師工資卡增加500

不能出現工資卡扣除500元,但Deer老師工資卡沒有增加500元的情況

要麼全部成功,要麼全部失敗

1.1.1.3.2. 一致性(consistency)

一致性是指事務將數據庫從一種一致性轉換到另外一種一致性狀態,在事務開始之前和事務結束之後數據庫中數據的完整性沒有被破壞

比如:

1.老婆大人工資卡扣除500元

2.Deer老師工資卡增加500

2.Deer老師工資卡增加1000

不能因爲任何原因,導致Deer老師收到兩次錢

1.1.1.3.3. 持久性(durability)

一旦事務提交,則其所做的修改就會永久保存到數據庫中。此時即使系統崩潰,已經提交的修改數據也不會丟失

1.1.1.3.4. 隔離性(isolation)

隔離性要求一個事務對數據庫中數據的修改,在未提交完成前對於其他事務是不可見的

 

  1. 事務隔離級別

mysql默認的事務隔離級別爲repeatable-read

show variables like '%tx_isolation%';

 

  1. 未提交讀(READ UNCOMMITED)髒讀

set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

測試:

啓動兩個session

 

一個session中

  start TRANSACTION

  update account set balance = balance -50 where id = 1

 

另外一個session中查詢

select * from account

 

回到第一個session中 回滾事務

ROLLBACK

 

 

在第二個session種

update account set balance = balance -50 where id = 1

查詢結果還是 400

 

第二個session以爲結果是350,但前面的400數據爲髒讀數據,導致最後的結果和意料中的結果並不一致。

 

  1. 已提交讀 (READ COMMITED)不可重複讀

測試

show variables like '%tx_isolation%';

 

set SESSION TRANSACTION ISOLATION LEVEL read committed;

 

 

一個session中

  start TRANSACTION

  update account set balance = balance -50 where id = 1

 

另外一個session中查詢 (數據並沒改變)

select * from account

 

回到第一個session中 回滾事務

commit

 

 

在第二個session種

select * from account (數據已經改變)

 

  1. 可重複讀(REPEATABLE READ)

測試

show variables like '%tx_isolation%';

 

set SESSION TRANSACTION ISOLATION LEVEL repeatable read;

 

 

一個session中

  start TRANSACTION

  update account set balance = balance -50 where id = 1

 

另外一個session中查詢 (數據並沒改變)

select * from account

 

回到第一個session中 回滾事務

commit

 

 

在第二個session種

select * from account (數據並未改變)

 

  1. 可串行化(SERIALIZABLE)

account 表有3條記錄,業務規定,最多允許4條記錄。

 

1.開啓一個事務

begin

select * from account  發現3條記錄

 

 

2.開啓另外一個事務

begin

select * from account  發現3條記錄 也是3條記錄

 

insert into account VALUES(4,'deer',500)

 

查詢  4條記錄

select * from account

 

 

3.回到第一個session

insert into account VALUES(5,'james',500)

select * from account  4條記錄

 

 

4.session1 與 session2 都提交事務

 

 

  1. set SESSION TRANSACTION ISOLATION LEVEL serializable; 重新上面的測試發現插入報錯

 

  1. 總結

 

事務隔離級別爲可重複讀時,如果有索引(包括主鍵索引)的時候,以索引列爲條件更新數據,會存在間隙鎖間、行鎖、頁鎖的問題,從而鎖住一些行;如果沒有索引,更新數據時會鎖住整張表

 

事務隔離級別爲串行化時,讀寫數據都會鎖住整張表

 

隔離級別越高,越能保證數據的完整性和一致性,但是對併發性能的影響也越大,對於多數應用程序,可以優先考慮把數據庫系統的隔離級別設爲Read Committed,它能夠避免髒讀取,而且具有較好的併發性能。

 

  1. 事務語法
  2. 開啓事務

1、begin

2、START TRANSACTION(推薦)

3、begin work

 

  1. 事務回滾 

rollback

 

  1. 事務提交

  commit

 

  1. 還原點

savepoint

show variables like '%autocommit%';  自動提交事務是開啓的

 

set autocommit=0;

 

insert into testdemo values(5,5,5);

savepoint s1;

insert into testdemo values(6,6,6);

savepoint s2;

insert into testdemo values(7,7,7);

savepoint s3;

 

 

 

select * from testdemo

rollback to savepoint s2

 

rollback

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章