標籤: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
650) this.width=650;" title="7E(0_[DX1C1A$7JE{TQ}V0J.png" src="http://s4.51cto.com/wyfs02/M02/82/A3/wKiom1ddXwajM5YUAAAMiQfb4o8056.png" alt="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;
650) this.width=650;" title="7E(0_[DX1C1A$7JE{TQ}V0J.png" src="http://s1.51cto.com/wyfs02/M00/82/A1/wKioL1ddYniCYx6OAAAMiQfb4o8936.png" alt="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;
650) this.width=650;" title="VQZQJAT6(1RU_PBP}B9[I9X.png" src="http://s5.51cto.com/wyfs02/M00/82/A1/wKioL1ddY2-wD1lNAAANJTxsRXk473.png" alt="wKioL1ddY2-wD1lNAAANJTxsRXk473.png" />
我們可以看到我們修改資料成功了。
mysql之事務