1. 程式人生 > >4、TCL(Transaction Control Language)事務控制語言

4、TCL(Transaction Control Language)事務控制語言

cbe 文件 關於 成功 手動 讀取 tab 新增 完成

一、事務定義

  • Transaction
  • 事務:一個最小的不可再分的工作單元;通常一個事務對應一個完整的業務(例如銀行賬戶轉賬業務,該業務就是一個最小的工作單元)
  • 一個完整的業務需要批量的DML(insert、update、delete)語句共同聯合完成
  • 事務只和DML語句有關,或者說DML語句才有事務。這個和業務邏輯有關,業務邏輯不同,DML語句的個數不同

二、轉賬操作理解事務

關於銀行賬戶轉賬操作,賬戶轉賬是一個完整的業務,最小的單元,不可再分————————也就是說銀行賬戶轉賬是一個事務 以下是銀行賬戶表t_act(賬號、余額),進行轉賬操作 actno   balance 1   500 2   100 轉賬操作
update t_act set balance=400 where actno=1; update t_act set balance=200 where actno=2; 以上兩臺DML語句必須同時成功或者同時失敗。最小單元不可再分,當第一條DML語句執行成功後,並不能將底層數據庫中的第一個賬戶的數據修改,只是將操作記錄了一下;這個記錄是在內存中完成的;當第二條DML語句執行成功後,和底層數據庫文件中的數據完成同步。若第二條DML語句執行失敗,則清空所有的歷史操作記錄,要完成以上的功能必須借助事務

三、事務四大特征(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語句操作歷史記錄和底層硬盤數據來一次同步 - 回滾:失敗的結束,將所有的DML語句操作歷史記錄全部清空

七、事物與數據庫底層數據

在事物進行過程中,未結束之前,DML語句是不會更改底層數據,只是將歷史操作記錄一下,在內存中完成記錄。只有在事物結束的時候,而且是成功的結束的時候,才會修改底層硬盤文件中的數據

八、在MySQL中,事務提交與回滾

在MySQL中,默認情況下,事務是自動提交的,也就是說,只要執行一條DML語句就開啟了事物,並且提交了事務 以上的自動提交機制是可以關閉的 對t_user進行提交和回滾操作 提交操作(事務成功)
  • start transaction
  • DML語句
  • commit
mysql> start transaction;#手動開啟事務 mysql> insert into t_user(name) values(‘pp‘); mysql> commit;#commit之後即可改變底層數據庫數據 mysql> select * from t_user; +----+------+ | id   | name | +----+------+ | 1   | jay | | 2   | man | | 3   | pp   | +----+------+ 3 rows in set (0.00 sec) 回滾操作(事務失敗)
  • start transaction
  • DML語句
  • rollback
mysql> start transaction; mysql> insert into t_user(name) values(‘yy‘); mysql> rollback; mysql> select * from t_user; +----+------+ | id   | name | +----+------+ | 1   | jay   | | 2   | man | | 3   | pp   | +----+------+ 3 rows in set (0.00 sec)

九、事務四大特性之一————隔離性(isolation)

  1. 事物A和事物B之間具有一定的隔離性
  2. 隔離性有隔離級別(4個)
  • 讀未提交:read uncommitted
  • 讀已提交:read committed
  • 可重復讀:repeatable read
  • 串行化:serializable
1、 read uncommitted - 事物A和事物B,事物A未提交的數據,事物B可以讀取到 - 這裏讀取到的數據叫做“臟數據” - 這種隔離級別最低,這種級別一般是在理論上存在,數據庫隔離級別一般都高於該級別 2、read committed - 事物A和事物B,事物A提交的數據,事物B才能讀取到 - 這種隔離級別高於讀未提交 - 換句話說,對方事物提交之後的數據,我當前事物才能讀取到 - 這種級別可以避免“臟數據” - 這種隔離級別會導致“不可重復讀取” - Oracle默認隔離級別 3、repeatable read - 事務A和事務B,事務A提交之後的數據,事務B讀取不到 - 事務B是可重復讀取數據 - 這種隔離級別高於讀已提交 - 換句話說,對方提交之後的數據,我還是讀取不到 - 這種隔離級別可以避免“不可重復讀取”,達到可重復讀取 - 比如1點和2點讀到數據是同一個 - MySQL默認級別 - 雖然可以達到可重復讀取,但是會導致“幻像讀” 4、serializable - 事務A和事務B,事務A在操作數據庫時,事務B只能排隊等待
- 這種隔離級別很少使用,吞吐量太低,用戶體驗差
- 這種級別可以避免“幻像讀”,每一次讀取的都是數據庫中真實存在數據,事務A與事務B串行,而不並發

十、隔離級別與一致性關系

技術分享圖片

技術分享圖片

十一、設置事務隔離級別

方式一
  • 可以在my.ini文件中使用transaction-isolation選項來設置服務器的缺省事務隔離級別。

該選項值可以是:

  – READ-UNCOMMITTED   – READ-COMMITTED   – REPEATABLE-READ   – SERIALIZABLE   ? 例如:   [mysqld]   transaction-isolation = READ-COMMITTED 方式二
  • 通過命令動態設置隔離級別
隔離級別也可以在運行的服務器中動態設置,應使用SET TRANSACTION ISOLATION LEVEL語句。 其語法模式為:   SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>   其中的<isolation-level>可以是:     – READ UNCOMMITTED     – READ COMMITTED     – REPEATABLE READ     – SERIALIZABLE     ? 例如: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

十二、隔離級別的作用範圍

? 事務隔離級別的作用範圍分為兩種:   – 全局級:對所有的會話有效   – 會話級:只對當前的會話有效 ? 例如,設置會話級隔離級別為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/73731377

4、TCL(Transaction Control Language)事務控制語言