MySQL數據庫8(二十一)事務
事務安全
事務概念
l Transaction
l 事務:一個最小的不可再分的工作單元;通常一個事務對應一個完整的業務(例如銀行賬戶轉賬業務,該業務就是一個最小的工作單元)
l 一個完整的業務需要批量的DML(insert、update、delete)語句共同聯合完成
l 事務只和DML語句有關,或者說DML語句才有事務。這個和業務邏輯有關,業務邏輯不同,DML語句的個數不同
事務由事務開始到事務結束之間執行的全體操作組成。
- 開啟事務:Start Transaction
- 事務結束:End Transaction
- 提交事務:Commit Transaction
- 回滾事務:Rollback Transaction
事務基本原理
基本原理:mysql允許將事務統一進行管理(存儲引擎innodb),將用戶所做的操作暫時保存起來,不直接放到數據表(更新),等到用戶確認結果之後再進行操作。
事務在mysql中通常是自動提交的,但是也是可以使用手動事務。
自動事務
自動事務:autocommit ,當客戶端發送一條SQL指令(寫操作:增刪改)給服務器的時候,服務器在執行之後,不用等待用戶反饋結果,會自動將結果同步到數據表。
證明:打開兩個客戶端,一個客戶端執行SQL指令,另一個客戶端查看執行結果。
自動事務:系統做了額外的步驟來幫助用戶操作,系統是通過變量來控制的。autocommit
關閉自動事務:關閉之後系統就不在幫助用戶提交結果了。
set autocommit = off;
查看執行結果
一旦自動事務關閉,那麽需要用戶提供是否同步的命令
Commit:提交(同步到數據表,事務會被清空)
Rollback:回滾(清空之前的操作,不要了)
事務沒有提交的對比查看:在執行事務端的客戶端中,系統在進行數據查看的時候會利用事務日誌進行數據加工。
事務提交
通常,我們不會關閉自動事務,這樣操作麻煩。因此只會在需要使用事務處理的時候,才會進行操作(手動事務)
手動事務
手動事務:不管是開始還是過程還是結束,都需要用戶(程序員)手動發送對應的事務操作指令來實現。
手動事務的命令:
1、start transaction; 開啟事務:從這條語句開始,後面的所有語句都不會直接寫入到數據表(保存在事務日誌中)
2、事務處理:多個指令構成
3、事務提交:commit/rollback,到這個時候所有的事務才算結束
開始事務
執行事務
將多個連續的但是是一個整體的SQL指令,逐一執行。
提交事務
確認提交:commit,數據寫到數據表,清空事務日誌
回滾操作:rollback,所有數據無效並清空
回滾點
回滾點:savepoint,當有一系列的事務操作時,而其中的步驟如果成功了沒有必要重新來過,那麽可以在某個成功點設置一個記號(回滾點),如果後面有失敗,那麽可以回到這個記號位置。
1、增加回滾點:savepoint 回滾點名字; //字母數字和下劃線構成
2、回到回滾點:rollback to 回滾點名字; //那個記號(回滾點)之後的所有操作沒有了
註意:如果在一個事務處理匯總,如果有很多步驟,那麽可以設置多個回滾點。但是如果回到了前面的回滾點,後面的回滾點就失效。
事務特點
事務具有4個屬性:原子性、一致性、隔離線持久性。這四個屬性通常稱為ACID特性
原子性(atomicity):一個事務是一個不可分割的工作單位,事務中包括的諸操作要麽都做,要麽都不做
事務從事務開始起到事務提交,要麽所有操作都成功,要麽所有操作都失敗。
一致性(consistency):事務必須是使數據庫從一致性狀態變到另一個一致性狀態,一致性和原子性是密切相關的。
數據表中的數據修改,要麽是所有操作一次性都修改,要麽根本不動。
隔離性(isloation):
一個事務的執行不能被其他事務幹擾。即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相幹擾
一個客戶端在使用事務操作一個數據(可能是一行或者整表)的時候,另外一個客戶端不能對該數據進行操作。
什麽時候是行被隔離?什麽時候是整表被隔離?
說明:如果條件中使用了索引(主鍵),那麽系統是根據主鍵直接找到某條記錄,這個時候與其他記錄無關,那麽只隔離條記錄;反之,如果說系統是通過全表檢索(每一條記錄都去檢查,沒有索引),被檢索的所有數據都會被鎖定(整表)
持久性(durability):持久性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
MySQL數據庫8(二十一)事務