mysql之事務

我們先來說說什麼是事務:

       事務就是邏輯上的一組操作,組成這組操作的各個單元,要不全都成功,要不全都失敗。一個事務是一個連續的一組數據庫操作,就好像它是一個單一的工作單元進行。換言之,永遠不會是完整的事務,除非該組內的每個單獨的操作是成功的。如果在事務的任何操作失敗,則整個事務將失敗。

       mysql的事務支持不是綁定在mysql服務器本身,而是與存儲引擎相關。例如,MyISAM:不支持事務,用於只讀程序提高性能;InnoDB:支持ACID事務,行級所,併發;Berkeley DB:支持事務。

      

事務的特性(ACID):

       1.原子性(Atomicity):確保工作單元內的所有操作都成功完成,否則事務將被終止在故障點,和以前的操作將回滾到以前的狀態。簡單的說就是,一組事務,要麼成功,要麼撤回;

       2.一致性(Consistency):確保數據庫正確地改變狀態後,成功提交的事務。

       3.隔離性(Isolation):使事務彼此的操作的獨立和透明,即事務獨立運行,一個事務處理後的結果,影響了其他事務,那麼其他事務會撤回。事務的100%隔離,需要犧牲速度。

       4.持久性(Durability):確保提交事務的結果或效果的系統出現故障的情況下讓然存在。


mysql的事務處理主要有兩種方式:

       1.用begin,rollback,commit來實現

          begin:開始一個事務

          rollback:事務回滾

          commit:事務確認

       2.直接用set來改變mysql的自動提交模式

          mysql默認是自動提交的,也就是你提交一個query,它就直接執行,我們可以通過下面的語句進行設置:

             set autocommit = 0  禁止自動提交

             set autocommit = 1  開啓自動提交

          我們要注意當我們用set autocommit = 0 的時候,你以後所有的sql都將作爲事務處理,直到我們用commit確認或rollback結束。當我們結束這個事務的同時也開啓了個新的事務。按第一種方法只將當前的作爲一個事務。mysql中只有INNODE和BDB類型的數據表才能支持事務處理,其他的類型是不支持的。


       在mysql中,事務開始使用COMMIT或ROLLBACK語句開始工作和結束。開始和結束語句的sql命令之間形成了大量的事務。

COMMIT&&ROLLBACK:

        這兩個關鍵字用於提交和回滾,主要用於mysql的事務。當一個成功的事務完成後,發出COMMIT命令應使所有參與表的更改纔會生效。如果發生故障,應發出一個ROLLBACK命令,使返回的事務中引用的每一個表回到以前的狀態。


使用mysql的過程:

       (1)在執行sql語句之前我們要開啓事務 start transaction

       (2)正常執行我們的sql語句

       (3)當sql語句執行完畢,存在兩種情況:

                a.全都成功,我們要將sql語句對數據庫造成的影響提交到數據庫中,commit

                b.某些sql語句失敗,我們執行rollback(回滾),將對數據庫的操作趕緊撤銷


接下來我們來看一個實例:(關於銀行存取錢的)

      create table bank(name varchar(20),money decimal(5,1))engine=innodb default charset = utf8

      insert into bank values(‘shaotuo’,1000),(‘laohu’,5000)

      select * from bank

       wKiom1ddXwajM5YUAAAMiQfb4o8056.png

       沒有成功的話執行回滾rollback

      start transaction;//開啓事務

      update bank set money=money+500 where name = ‘shaotuo’//修改數據

      update bank set moey=money-500 where name = ‘laohu’

      ERROR 1054(42522):Unknown column ‘moey’in ‘filed list’

     

      由於上述有一個錯誤,我們要執行回滾rollback操作:

       rollback;

       select * from bank;

       wKioL1ddYniCYx6OAAAMiQfb4o8936.png

      我們可以看到表沒有變化

      成功之後進行commit操作:

      start transaction;

       update bank set money=money+500 where name = ‘shaotuo’

       update bank set money=money-500 where name = ‘laohu’

       兩個都執行成功後commit

       commit;

       select * from bank;

       wKioL1ddY2-wD1lNAAANJTxsRXk473.png

    我們可以看到我們修改數據成功了。


     


























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章