文章目錄
一、事務執行的特點
要麼全部執行成功,要麼全部執行失敗
二、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. 事務的關鍵詞
- 事務(transaction):指一組sql語句
- 回退(rollback):指撤銷指定sql語句的過程
- 提交(commit):指將未存儲的sql語句的結果寫入到數據庫
- 保留點(savepoint):指事務出裏中設置的臨時佔位符,可以對它發佈回退
2. 開啓事務(start transaction)
- 使用該關鍵詞標識事務的開始
3. 回退語句(rollback)
- 定義:撤銷指定sql語句,rollback只能在一個事務處理內使用,在執行一條start transaction之後
- 命令:
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)
- 定義:將未保存sql語句執行結果保存到數據庫中,一般的sql語句都是提交和保存都是自動進行的,而事務不能自動保存,需要管理員手動明確的表示提交。
- 命令:
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)
- 定義:保留點越多越好,可以創建保留點,讓事務處理在合適的地方放置保留點,需要回退可以回退到某個保留點。
- 命令:
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)
- 定義:默認的sql語句都是自動進行提交更改的,有時我們不需要系統自動進行提交的時候,可以更改系統的默認值,但是這樣修改後,每次執行語句後都必須使用commit提交事務後,語句結果纔會生效。
- 命令:
set autocommit=0;
#定義爲0就是標識爲假了,系統不再自動提交更改,直到autocommit等於1爲真