1. 程式人生 > >MySQL學習之事務安全

MySQL學習之事務安全

分割 編程語言 9.png 服務器 ons 實現 相關 save bsp

事務安全

事務概念

事務(transaction)是訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit),事務通常由高級數據操縱語言或編程語言

書寫的用戶程序的執行所引起。事務有事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操作組成。

事務基本原理

基本原理:MySQL允許將事務統一進行管理(存儲引擎INNODB),將用戶所做的操作,暫時保存起來,不直接放到數據表中(更新)

,等到用戶確認結果之後再進行操作。

技術分享圖片

事務在MySQL中通常是自動提交,但是也可以使用手動提交。

自動事務

自動事務:autocommit,當客戶端發送一條SQL指令(寫操作,增刪改)給服務器的時候,服務器在執行之後,不用等待用戶反饋

結果,會自動將結果同步到數據表中。

證明:利用兩個客戶端,一個客戶端執行SQL指令,另外一個客戶端進行查看。

技術分享圖片

自動事務:系統做了額外的步驟來幫助用戶操作,系統是通過變量來控制的。autocommit。

show variables like ‘autocommit%‘;

技術分享圖片

關閉自動事務,關閉之後系統就不再幫助用戶提交結果了。

技術分享圖片

技術分享圖片

一旦自動呢事務關閉,那麽需要用戶提供是否同步的命令。

1.commit:提交(同步到數據庫 ,事務也會被清空)。

2.rollback:回滾(清空之前的操作,不要了)。

技術分享圖片

事務沒有提交的對比查看,在執行事務端的客戶端中,系統在進行數據查看的時候會利用事務日誌中保存的

結果對數據進行加工。

技術分享圖片

通常,我們不會關閉自動事務,這樣操作太麻煩,因此只會在需要使用事務處理的時候,才進行操作(手動事務)。

手動事務

手動事務:不管是開始還是過程還是結束都需要用戶(程序員),手動的發送事務操作指令來實現數據同步。

手動事務對應的命令:

1.start transaction; // 開始事務,從這條語句開始,後面的所有語句都不會直接寫入到數據庫表中,而是保存在(事務日誌中)

2.事務處理:多個寫指令構成。

3.事務提交:commit/rollback,到這個時候所有的事物才算結束。要麽將之前的所有操作提交,要麽就都不提交。

開啟事務

技術分享圖片

執行事務

將多個連續的但是是一個整體的SQL指令,逐一執行。

技術分享圖片

提交事務

確認提交:commit,數據寫到數據表中(清空)。

回滾操作:rollback,所有數據無效並清空。

回滾點

當事務處理很多步的時候,如果只有提交和回滾兩個操作的話,那麽可能是很麻煩的,比如你已經成功了大半,但是最後有個操作錯誤了,

那麽直接回滾效率很低的,基於這種情況,可以使用回滾點,可以回滾到指定的事務處理的位置。可以在某個點(成功),設置一個記號,

然後如果後面有失敗,那麽可以回到這個記號位置。

增加回滾點:savepoint 回滾點名字; // 字母數字和下劃線構成。

技術分享圖片

回到回滾點:rollback to 回滾點名字; // 那麽記號(回滾點)之後的所有操作沒有了。

註意:在一個事務處理中,如果有很多個步驟,那麽可以設置多個回滾點,但是如果回到了前面的回滾點,後面的回滾點就失效。

技術分享圖片

事務特點

事務應該具有4個屬性:原子性,一致性,隔離性,持久性。這四個屬性通常稱為ACID特性。

原子性(atomicity)

一個事務是一個不可分割的工作單位,事務中包括的諸多操作要麽都做,要麽都不做。

事務從start transaction起到提交事務(commit或者是rollback),要麽所有的操作都成功,要麽所有的操作都失敗。

一致性(consistency)

事務必須是使數據庫從一個一致狀態變化到另一個一致狀態,一致性與原子性是密切相關,數據表中的數據修改,

要麽是所有操作一次性修改,要麽就根本不變。

隔離性(isolation)

一個事務的執行不能被其他事務幹擾。即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的

各個事務之間不能相互幹擾。

如果一個客戶端在使用事務操作一個數據(可能是一行/整個表)的時候,另一個客戶端不能對該數據進行操作。

技術分享圖片

什麽時候是行被隔離?什麽時候是整個表被隔離?

說明:如果條件中使用了索引(主鍵),那麽系統是根據主鍵直接找到某條記錄的,這個時候與其他記錄無關,那麽只隔離一條記錄;反之,如果說系統是通過全表檢索(每一條記錄都去檢查,沒有索引),被檢索的所有數據都會被鎖定(整個表)。

持久性(durability)

持久性也稱永久性(permanence),指的是一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

MySQL學習之事務安全