MySQL資料庫的事務開啟,提交和回滾
阿新 • • 發佈:2020-12-19
事務(transaction)是使用者定義的一個數據庫操作序列,這些操作要麼全做,要麼全不做,是一個不可分割的工作單位。
基於事務的原子性、一致性、隔離性和持續性特徵,可以將相關的資料操作定義到一個事務當中。
如果操作過程中沒有發生異常情況,就提交事務(commit)
如果發生了異常,就可以利用事務回滾(rollback),將資料庫恢復到事務開啟之前的狀態。
下面,通過一個小案例,演示事務的提交和回滾(重點在於回滾)。
開啟事務: begin; 提交事務:commit; 回滾:rollback;
操作示例:
mysql> #開啟事務 -> begin; Query OK, 0 rows affected (0.00 sec) mysql> select * from student; +----+------+-----+ | Id | Name | Age | +----+------+-----+ | 1 | 李華 | 23 | | 2 | 李強 | 22 | | 3 | 劉明 | 26 | | 4 | 傑克 | 21 | +----+------+-----+ 4 rows in set (0.06 sec) mysql> #插入操作 -> insert into student values(5,'Jimmy',20); Query OK, 1 row affected (0.00 sec) mysql> select * from student; +----+-------+-----+ | Id | Name | Age | +----+-------+-----+ | 1 | 李華 | 23 | | 2 | 李強 | 22 | | 3 | 劉明 | 26 | | 4 | 傑克 | 21 | | 5 | Jimmy | 20 | +----+-------+-----+ 5 rows in set (0.06 sec) mysql> #回滾操作 -> rollback; Query OK, 0 rows affected (0.05 sec) mysql> select * from student; +----+------+-----+ | Id | Name | Age | +----+------+-----+ | 1 | 李華 | 23 | | 2 | 李強 | 22 | | 3 | 劉明 | 26 | | 4 | 傑克 | 21 | +----+------+-----+ 4 rows in set (0.06 sec) mysql> insert into student values(5,'Jimmy',20); Query OK, 1 row affected (0.08 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> select * from student; +----+-------+-----+ | Id | Name | Age | +----+-------+-----+ | 1 | 李華 | 23 | | 2 | 李強 | 22 | | 3 | 劉明 | 26 | | 4 | 傑克 | 21 | | 5 | Jimmy | 20 | +----+-------+-----+ 5 rows in set (0.06 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from student; +----+-------+-----+ | Id | Name | Age | +----+-------+-----+ | 1 | 李華 | 23 | | 2 | 李強 | 22 | | 3 | 劉明 | 26 | | 4 | 傑克 | 21 | | 5 | Jimmy | 20 | +----+-------+-----+ 5 rows in set (0.05 sec)
從上面的操作可以看到,開啟事務之後對資料庫進行操作,操作時候隨即進行檢視,可以看到記錄是被修改的狀態。但是隨著事務回滾操作的進行,資料被退回到事務開始之前的狀態。但是提交之後,回滾就不起作用了。
不論是上一次演示的事務提交被修改還是上面演示的回滾之後資料操作被回退,都是事務的正常應用。當事務被開啟之後,對資料庫所進行的操作都回被快取起來,當提交事務的時候才會真正操作並寫入到資料庫中,如果選擇的不是提交而是回滾,就不會將事務中定義的操作運用到資料庫中。
資料庫事務應用
程式設計中,如果不確定對資料庫的操作一定回成功,比如完成某一功能需要進行多次資料庫操作,如果前面的操作都成功了,但是後面的某一步操作因為某些原因失敗,就需要進行重新操作,這個時候,我們希望資料庫是操作之前的狀態,事務就可以幫我們完成這樣的設計。在這一組操作之前,開啟一個事務,每進行一個操作都對操作進行驗證,確保操作被有效進行,如果所有操作都正確執行,就提交事務,如果有哪步操作發生了異常,就進行事務回滾。