關於MySQL中的事務、提交(commit)、回滾(rollback)
事務:數據庫管理系統執行過程中的一個邏輯單位,由一個有限的數據庫操作序列構成。
摘要:
一個數據庫事務通常包含了一個序列的對數據庫的讀/寫操作。
它的存在包含有以下兩個目的:
1.為數據庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即使在異常狀態下仍能保持一致性的方法。
2.當多個應用程序在並發訪問數據庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。
當事務被提交給了DBMS(數據庫管理系統),則DBMS需要確保該事務中的所有操作都成功完成且其結果被永久保存在數據庫中,如果事務中有的操作沒有成功完成,則事務中的所有操作都需要被回滾,回到事務執行前的狀態;
同時,該事務對數據庫或者其他事務的執行無影響,所有的事務都好像在獨立的運行。
事務性質
數據庫事務擁有以下四個特性,習慣上被稱之為ACID特性。
- 原子性(Atomicity):事務作為一個整體被執行,包含在其中的對數據庫的操作要么全部被執行,要么都不執行。
- 一致性(Consistency):事務應確保數據庫的狀態從一個一致狀態轉變為另一個一致狀態。一致狀態的含義是數據庫中的數據應滿足完整性約束。
- 隔離性(Isolation):多個事務並發執行時,一個事務的執行不應影響其他事務的執行。
- 持久性(Durability):已被提交的事務對數據庫的修改應該永久保存在數據庫中。
關於事務的一些術語
- 開啟事務:Start Transaction
- 事務結束:End Transaction
- 提交事務:Commit Transaction
- 回滾事務:Rollback Transaction
和事務相關的兩條重要的SQL語句(TCL)
- commit:提交
- rollback:回滾
事務開啟的標志?事務結束的標志?
開啟標志:
- 任何一條DML語句(insert、update、delete)執行,標志事務的開啟
結束標志(提交或者回滾):
- 提交:成功的結束,將所有的DML語句操作歷史記錄和底層硬盤數據來一次同步
- 回滾:失敗的結束,將所有的DML語句操作歷史記錄全部清空
最初校園的老師講事務的時候喜歡講這么一個例子:你向別人匯款1000元,你的賬戶金額減少1000,對方的賬戶金額增加1000元視為該過程成功,其他情況比如你的賬戶金額減少1000,對方並未增加視為失敗,事務回滾,該事物執行的過程是2步,(1)你的金額減少 (2)對方的金額增加 若(1)與(2)同時成功,執行commit,若未同時成功執行rollbak,回滾到未進行任何操作的狀態
mysql可以回滾的幾個設置:
一、配置事務,兩個方法,(1)修改配置文件 (2)設置環境變量
MySQL客戶端shell關於“自動提交”和“事務”的參數是autocommit,默認值是1,即默認開啟自動提交,事務不開啟。
所以當你每次使用insert、delete、update等語句的時候,數據表實際就會完成更改。
修改配置則有兩種方式。
查看 MySQL 客戶端的事務提交方式命令:
select @@autocommit; 或者 show variables like 'autocommit';
修改 MySQL 客戶端的事務提交方式為手動提交命令:
set @@autocommit = 0; 或者 set @@autocommit = 'off';
1 修改my.cnf配置文件
[mysqld] # 新增如下內容,預連接選項 init_connect='SET autocommit=0'
注意:
連接mysql用戶的權限不能大於啟動mysql的用戶的權限,不然init_connect='SET autocommit=0’根本不會啟作用,也不會報任何錯誤
2 設置環境變量
此種方式開啟的事務僅僅對本次連接和本次連接開啟的客戶端shell有效,關閉后再開啟則恢復配置文件所定義的或者默認配置的狀態。
先通過以下兩種方式查詢
然后在另一個查詢窗口中
不同的查詢窗口看到的結果是不同的,原因是:第一個窗口的結果off是自己設置的
第二個結果是默認的,也就是說回應了前面提到的【此種方式開啟的事務僅僅對本次連接和本次連接開啟的客戶端shell有效】
當autocommit的value值是off的情況下,執行DML語句,需要執行commit語句,運行的dml才能真正的生效,不然僅在該查詢窗口中執行,其他窗口的查詢結果依然是未執行dml語句前的值,
注意:
直接退出客戶端,事務中的變更不會默認保存 --【此種方式開啟的事務僅僅對本次連接和本次連接開啟的客戶端shell有效】
3、直接開始事務
除了配置開啟事務,也可以直接使用start transaction開啟事務。
注意:
這種方式在當你使用commit或者rollback后,事務就結束了
再次進入事務狀態需要再次start transaction
上面是最初的數據
然后執行start transaction;語句
然后執行上面update語句后,查詢結果如上圖
執行rollbak;語句后
又回到最初的數據狀態
總結:在上面提到三種的可以回滾的方法中,方法2與方法3是已經驗證過