4、TCL(Transaction Control Language)事務控制語言
阿新 • • 發佈:2018-11-25
cbe 文件 關於 成功 手動 讀取 tab 新增 完成
update t_act set balance=400 where actno=1;
update t_act set balance=200 where actno=2;
以上兩臺DML語句必須同時成功或者同時失敗。最小單元不可再分,當第一條DML語句執行成功後,並不能將底層數據庫中的第一個賬戶的數據修改,只是將操作記錄了一下;這個記錄是在內存中完成的;當第二條DML語句執行成功後,和底層數據庫文件中的數據完成同步。若第二條DML語句執行失敗,則清空所有的歷史操作記錄,要完成以上的功能必須借助事務
- 提交:成功的結束,將所有的DML語句操作歷史記錄和底層硬盤數據來一次同步 - 回滾:失敗的結束,將所有的DML語句操作歷史記錄全部清空
- 這種隔離級別很少使用,吞吐量太低,用戶體驗差
- 這種級別可以避免“幻像讀”,每一次讀取的都是數據庫中真實存在數據,事務A與事務B串行,而不並發
一、事務定義
- Transaction
- 事務:一個最小的不可再分的工作單元;通常一個事務對應一個完整的業務(例如銀行賬戶轉賬業務,該業務就是一個最小的工作單元)
- 一個完整的業務需要批量的DML(insert、update、delete)語句共同聯合完成
- 事務只和DML語句有關,或者說DML語句才有事務。這個和業務邏輯有關,業務邏輯不同,DML語句的個數不同
二、轉賬操作理解事務
關於銀行賬戶轉賬操作,賬戶轉賬是一個完整的業務,最小的單元,不可再分————————也就是說銀行賬戶轉賬是一個事務 以下是銀行賬戶表t_act(賬號、余額),進行轉賬操作 actno balance 1 500 2 100 轉賬操作三、事務四大特征(ACID)
- 原子性Atomicity(A):事務是最小單位,不可再分
- 一致性Consistency(C):事務要求所有的DML語句操作的時候,必須保證同時成功或者同時失敗
- 隔離性Isolation(I):事務A和事務B之間具有隔離性
- 持久性Durability(D):是事務的保證,事務終結的標誌(內存的數據持久到硬盤文件中)
四、關於事務的一些術語
- 開啟事務:Start Transaction
- 事務結束:End Transaction
- 提交事務:Commit Transaction
- 回滾事務:Rollback Transaction
五、和事務相關的兩條重要的SQL語句(TCL)
- commit:提交
- rollback:回滾
六、事務開啟的標誌?事務結束的標誌?
開啟標誌: - 任何一條DML語句(insert、update、delete)執行,標誌事務的開啟 結束標誌(提交或者回滾):七、事物與數據庫底層數據
在事物進行過程中,未結束之前,DML語句是不會更改底層數據,只是將歷史操作記錄一下,在內存中完成記錄。只有在事物結束的時候,而且是成功的結束的時候,才會修改底層硬盤文件中的數據八、在MySQL中,事務提交與回滾
在MySQL中,默認情況下,事務是自動提交的,也就是說,只要執行一條DML語句就開啟了事物,並且提交了事務 以上的自動提交機制是可以關閉的 對t_user進行提交和回滾操作 提交操作(事務成功)- start transaction
- DML語句
- commit
- start transaction
- DML語句
- rollback
九、事務四大特性之一————隔離性(isolation)
- 事物A和事物B之間具有一定的隔離性
- 隔離性有隔離級別(4個)
- 讀未提交:read uncommitted
- 讀已提交:read committed
- 可重復讀:repeatable read
- 串行化:serializable
- 這種隔離級別很少使用,吞吐量太低,用戶體驗差
- 這種級別可以避免“幻像讀”,每一次讀取的都是數據庫中真實存在數據,事務A與事務B串行,而不並發
十、隔離級別與一致性關系
十一、設置事務隔離級別
方式一- 可以在my.ini文件中使用transaction-isolation選項來設置服務器的缺省事務隔離級別。
該選項值可以是:
– READ-UNCOMMITTED – READ-COMMITTED – REPEATABLE-READ – SERIALIZABLE ? 例如: [mysqld] transaction-isolation = READ-COMMITTED 方式二- 通過命令動態設置隔離級別
十二、隔離級別的作用範圍
? 事務隔離級別的作用範圍分為兩種: – 全局級:對所有的會話有效 – 會話級:只對當前的會話有效 ? 例如,設置會話級隔離級別為READ COMMITTED : mysql> SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 或: mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; ? 設置全局級隔離級別為READ COMMITTED : mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;十三、查看隔離級別
? SELECT @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec) 一點兒概念: 1、臟讀:事務A讀取了事務B更新的數據,然後B回滾操作,那麽A讀取到的數據是臟數據 2、不可重復讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果 不一致。 3、幻讀:系統管理員A將數據庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過 來,就好像發生了幻覺一樣,這就叫幻讀。 小結:不可重復讀的和幻讀很容易混淆,不可重復讀側重於修改,幻讀側重於新增或刪除。解決不可重復讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表 一點兒補充: 1、事務隔離級別為讀提交時,寫數據只會鎖住相應的行 2、事務隔離級別為可重復讀時,如果檢索條件有索引(包括主鍵索引)的時候,默認加鎖方式是next-key 鎖;如果檢索條件沒有索引,更新數據時會鎖住整張表。一個間隙被事務加了鎖,其他事 務是不能在這個間隙插入記錄的,這樣可以防止幻讀。 3、事務隔離級別為串行化時,讀寫數據都會鎖住整張表 4、隔離級別越高,越能保證數據的完整性和一致性,但是對並發性能的影響也越大。 5、MYSQL MVCC實現機制參考鏈接:https://blog.csdn.net/whoamiyang/article/details/51901888 6、關於next-key 鎖可以參考鏈接:https://blog.csdn.net/bigtree_3721/article/details/737313774、TCL(Transaction Control Language)事務控制語言