1、事務概念:
一組sql語句操作單元,組內所有SQL語句完成一個業務,如果整組成功:意味着全部SQL都實現;如果其中任何一個失敗,意味着整個操作都失敗。失敗,意味着整個過程都是沒有意義的。應該是數據庫回到操作前的初始狀態。這種特性,就叫“事務”。
2、為什么要存在事務?
1)失敗后,可以回到開始位置
2)沒都成功之前,別的用戶(進程,會話)是不能看到操作內的數據修改的
3、事務4大特征ACID:
1)原子性[atomicity]:功能不可再分,要么全部成功,要么全部失敗
2)一致性[consistency]:事務要求所有的DML語句操作的時候,必須保證同時成功或者同時失敗
3)隔離性[isolation]:事務A和事務B之間具有隔離性
4)持久性[durability]:是事務的保證,事務終結的標志(內存的數據持久到硬盤文件中)
3、相關概念:
【SQL執行過程】1)執行階段 2)將執行結果,提交到數據庫的階段
其中我們的事務日志,就是保存執行階段的結果,如果用於選擇提交,則才將執行的結果提交到數據庫。
默認的執行方式叫做,自動提交。執行完畢,自動完成提交工作。如果你想要所有SQL語句全部成功,就需要關閉自動提交功能。
“自動提交”:存在一個系統變量,Autocommit可以對自動提交進行設置。
4、事務操作:
方法一:
show variables like 'autocommit'; #查看自動提交是否開啟
set autocommit=1(開啟自動提交)
set autocommit=0(關閉自動提交),關閉后,再次執行相應的更新語句發現,在其它連接(會話)中查看數據,沒有發生變化,因為結果沒有提交。
方法二(提倡):
1)開啟事務:start transaction; 關閉自動提交。如果事務結束了,成功或者失敗,都會將自動提交機制,回到start時的狀態。
2)成功-->提交:commit;
3)失敗-->回滾:rollback;
5、重要限制:
存儲引擎必須是innodb才能生效。
6、個人理解:
把事務看作一個容器,暫時在該容器(start transaction)中操作(增刪改查),如果不出錯,就立即更新數據庫(commit),即公開可見。如果出錯,就立即回滾數據庫(rollback),即恢復初始狀態,數據庫更新停止。
可以高效地防止錯誤的發生,快速恢復至初始化狀態。
7、實驗測試:
步驟一:新建兩張表,一張是班費表(class),另一張是學生個人錢財表(stu)。
步驟二:開啟事務進行數據操作,注意同時開兩個數據庫窗口,方便我們查看實驗效果
窗口1:
此時,可以查看到窗口1中的數據已經更新(我的理解是僅僅是在“事務容器”內更新完成),但是還沒有上傳至數據庫真正更新。在另一個窗口中可見數據庫並沒有更新成功:
此時,必須在窗口1中的事務中輸入commit命令,才能完成真正意義上的更新,無論開多少個窗口,都可以看到數據更新的內容:
如果在“事務容器”中更新數據時出現問題,就需要使用rollback命令立即恢復到初始狀態。