MySQL的事務的實現與數據庫的ACID特性

一、事務執行的特點

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

二、ACID特性

1.原子性(atomicity)

每個事務都必須被視爲一個不可分割的最小工作單元,整個事務要麼全部提交成功要麼全部失敗回滾,對於事務來說不可能也不可以只執行其中的一部分,這就稱爲事務的原子性。

2.一致性(consistency)

是從一個一致性的狀態轉換到另一個一致性的狀態,確保語句之間有一致性,還是要麼全部提交都保存到數據庫中,要麼都不保存,這就是一致性。

3.隔離性(isolation)

一個事務所執行的語句結果在最終提交之前,是對其他事務不可見的,這只是通常來說,因爲MySQL的隔離性很複雜,會有隔離級別來限制,下一篇文章將會詳細解釋隔離級別。

4.持久性(durability)

一旦事務提交,數據將會永遠保存到數據庫中,這就是所謂的持久性,此時即使數據庫系統崩潰也不會產生數據丟失的情況。持久性會有持久性策略來確保數據的安全保障,在後續文章中會繼續解釋。

三、事務的優缺點

優點

會提供更高數據安全性,比如去銀行轉賬時,在執行完成扣光你的錢後,可是轉賬到目的地的時候系統卻崩潰了,那麼你的錢就白白損失了,如果使用事務的ACID特性,那麼將會轉賬成功,因爲保證了原子性、持久性、隔離性以及一致性。

缺點

系統會消耗額外的資源,如果使用一個非事務性的引擎,那麼同樣的硬件設施將會提供更強勁的性能。

四、事務的實現

實驗環境搭建:

create database test;
use test;
create table list1 (id int, name char(10));
insert into list1(id,name) values(1,'成龍');
insert into list1(id,name) values(2,'李小龍');
#以上內容複製即可

mysql> select * from list1;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 成龍   |
|    2 | 李小龍 |
+------+--------+
2 rows in set (0.00 sec)

1. 事務的關鍵詞

  1. 事務(transaction):指一組sql語句
  2. 回退(rollback):指撤銷指定sql語句的過程
  3. 提交(commit):指將未存儲的sql語句的結果寫入到數據庫
  4. 保留點(savepoint):指事務出裏中設置的臨時佔位符,可以對它發佈回退

2. 開啓事務(start transaction)

  1. 使用該關鍵詞標識事務的開始

3. 回退語句(rollback)

  1. 定義:撤銷指定sql語句,rollback只能在一個事務處理內使用,在執行一條start transaction之後
  2. 命令:
start transaction;		--開啓事務處理
delete from list1;		--刪除emp表中的內容
select * from list1;		--emp表中內容被清空
	Empty set (0.00 sec)
	
rollback;				--對事務進行回退處理

結果:
mysql> select * from list1;--emp表中的內容再次迴歸
+------+--------+
| id   | name   |
+------+--------+
|    1 | 成龍   |
|    2 | 李小龍 |
+------+--------+
2 rows in set (0.00 sec)		

4. 提交語句(commit)

  1. 定義:將未保存sql語句執行結果保存到數據庫中,一般的sql語句都是提交和保存都是自動進行的,而事務不能自動保存,需要管理員手動明確的表示提交。
  2. 命令:
start transaction;									--開啓事務
delete from list1 where id=1;						--刪除
commit;												--保存事務做出的結果

結果:
mysql> select * from list1;							--事務提交後結果將會永久保存
+------+--------+
| id   | name   |
+------+--------+
|    2 | 李小龍 |
+------+--------+
1 row in set (0.00 sec)

5. 使用保留點(savepoint)

  1. 定義:保留點越多越好,可以創建保留點,讓事務處理在合適的地方放置保留點,需要回退可以回退到某個保留點。
  2. 命令:
insert into list1(id,name) values(1,'成龍');		--恢復實驗環境
start transaction;				--開啓事務
delete from list1 where id=1;;	--刪除id爲1的那一行
savepoint delete1;				--定義恢復點的名稱
delete from list1 where id=2;	--刪除id爲4的那一行
rollback to delete1;			--恢復到恢復點爲delete的那一點
#保留點保留的是定義保留點後的一條sql語句,而不是前一條sql語句!!!!!!
commit;							--提交事務

結果:
mysql> select * from list1;
+------+--------+
| id   | name   |
+------+--------+
|    2 | 李小龍 |
+------+--------+
1 row in set (0.00 sec)

	釋放保留點:
	release savepoint;			--可以直接將自己保存的保留點釋放

6. 更改系統默認的提交行爲(autocommit)

  1. 定義:默認的sql語句都是自動進行提交更改的,有時我們不需要系統自動進行提交的時候,可以更改系統的默認值,但是這樣修改後,每次執行語句後都必須使用commit提交事務後,語句結果纔會生效。
  2. 命令:
set autocommit=0;
#定義爲0就是標識爲假了,系統不再自動提交更改,直到autocommit等於1爲真
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章