1. 程式人生 > >MySQL數據庫8(二十一)事務

MySQL數據庫8(二十一)事務

進行 nod 隔離性 檢查 永久 sql數據庫 nbsp tran bubuko

事務安全

事務概念

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(二十一)事務