1、什麼是事務一個事務是一個完整的業務邏輯單元,不可再分。 比如:銀行轉賬,從A賬戶向B賬務轉賬10000,需要執行兩條update語句 update t_act set balance = balance - 10000 where actno = 'act-001' ; update t_act ...
1、什麼是事務
一個事務是一個完整的業務邏輯單元,不可再分。
比如:銀行轉賬,從A賬戶向B賬務轉賬10000,需要執行兩條update語句
update t_act set balance = balance - 10000 where actno = 'act-001' ; update t_act set balance = balance + 10000 where actno = 'act-002' ;
以上兩條DML語句必須同時成功,或同時失敗,不允許一條成功,一條失敗!
想要保證以上的兩條DML語句(update、insert、delete)同時成功或者同時失敗,那麼就需要使用資料庫的“事務機制” !
2、事務原理
假設一個事兒,需要先執行一條insert,再執行一條update,最後執行一條delete,這個事兒才算完成。
開啟事務機制(開始)
- 執行insert語句–>insert.(這個執行成功之後,把這個執行記錄到資料庫的操作歷史當中,並不會向文件中保存-條數據,不會真正的修改硬碟上的數據。)
- 執行update語句—> update…(這個執行也是記錄一下歷史操作,不會真正的修改硬碟上的數據)
- 執行delete語句---->delete…(這個執行也是記錄一下歷史操作【記錄到緩存】,不會真正的修改硬碟上的數據)
提交事務或者回滾事務(結束)
怎麼提交事務,怎麼回滾事務?
提交事務:commit;語句
回滾事務:rollback;語句==(回滾永遠都是只能回到上次事務的提交點!)==
MySQL預設的事務行為是怎麼樣的?
MySQL預設情況下是支持自動提交事務的。(自動提交):就是一條DML提交一次!
怎麼樣才能將MySQL的自動提交事務關閉呢?
先執行如下命令:start transaction ,開啟事務,也是將自動提交事務關閉!
在次命令後的指定的DML語句並不會持久化到資料庫,等待commit | rollback 操作!
3、事務的特性:ACID
A:原子性(atomicity):事務是最小的工作單元,不可再分。
C:一致性(consistency):事務必須保證多條DML語句同時成功或同時失敗。
I :隔離性(isolation):事務A與事務B之間具有隔離。
D:持久性(durability):持久性說的時最終的數據必須持久化道硬碟文件中,事務才算成功的結束。
4、事務的隔離性
將事務A與事務B分別比作教室A,B,然而它們之間的牆就是隔離性,牆越厚隔離級別越高!(這種牆分為四個級別)
- 第一級別:讀未提交(read uncommitted):我們當前事務可以讀取對方未提交的事務,
- 存在問題:存在臟讀(Dirty read)現象,表示讀到了髒的數據。
- 第二級別:讀已提交(read committed):我們當前事務可讀取對方已提交的事務,解決了臟讀現象,存在問題:不可重覆讀。
- 第三級別:可重覆讀(repeatable read):解決不可重覆讀,永遠讀取到的都是開啟事務時的數據,==存在問題:讀取到的數據是幻像(幻讀)==例如:執行一條查詢的sql需要從1點3點,那麼這條sql讀取的一直是1點的數據,即使13點之間存在其他操作,該sql的結果並不會受到影響,類似快照,一直讀取的是快照中的數據。
- 第四級別:序列化讀/串列化讀(serializable):解決了所有問題。 效率低,需要事務排隊(類似於synchronized)。
Oracle資料庫預設級別:第二級別;讀已提交
Mysql資料庫預設級別:第三級別,可重覆讀
5、驗證各種隔離級別
對以上各種隔離級別做一個驗證
通過命令 select @@tx_isolation;查看當前事物的隔離級別 ! +-------------------+ | @@tx_isolation | +-------------------+ | REPEATABLE-READ | +-------------------+
讀未提交(read uncommitted):
#執行如下命令,設置全局的事務隔離級別為讀未提交 set global transaction isolation level read uncommitted;
讀已提交(read committed):
測試 讀已提交(read committed)
#執行如下命令,設置全局的事務隔離級別為讀已提交 set global transaction isolation level read committed;
可重覆讀(repeatable read):
測試:可重覆讀(repeatable read)
#執行如下命令,設置全局的事務隔離級別為可重覆讀 set global transaction isolation level read committed;
序列化讀/串列化讀(serializable):
測試 序列化讀/串列化讀(serializable)
#執行如下命令,設置全局的事務隔離級別為可重覆讀 set global transaction isolation level serializable;
本文來自博客園,作者:腹白,轉載請註明原文鏈接:https://www.cnblogs.com/wyh518/