本篇講述數據庫中很是重要的事務概念和如何使用MySQL命令行窗口來進行數據庫的事務操做。下一篇會講述如何使用JDBC進行數據庫的事務操做。程序員
事務是指數據庫中的一組邏輯操做,這個操做的特色就是在該組邏輯中,全部的操做要麼所有成功,要麼所有失敗。在各個數據具備特別緊密的聯繫時,最好是使用數據庫的事務來完成邏輯處理。sql
例如路人甲A給路人甲B轉帳1000元,對應於以下兩條SQL命令:數據庫
update from account set money=money-1000 where name=’A’; update from account set money=money+1000 where name=’B’;
在上面兩條SQL語句中,任意一條SQL執行過程當中出現了錯誤,那麼就有可能形成A與B兩人最後總金額的錯誤。但若是是使用事務來處理,即便上面的轉帳過程出現了錯誤,那麼以前執行的數據庫操做即便成功也會一併回滾,造成全部的SQL操做所有失敗,保證全部人的金額不變。spa
MySQL數據庫默認事務是自動提交的,也就是發一條SQL數據庫就執行一條。若是想將多條SQL放置在一個事務中執行,就必須使用以下語句:命令行
start transaction sql1 sql2 … commit
當開啓事務後(start transaction),不管數據庫是否對其中的多條SQL語句是否執行成功,只要沒有提交事務(commit),都會將以前執行的SQL進行回滾。使數據回到開啓事務以前的值。3d
在MySQL中,與事務相關的有開啓事務(START TRANSACTION),提交事務(COMMIT),回滾事務(ROLLBACK)等等,下面將依次使用到。code
接下來將會在先使用數據庫命令行窗口來進行事務操做的案例。blog
首先定義表account和客戶以及金額兩個列數據項:事務
create database jdbcdemo; use jdbcdemo; create table account( id int primary key auto_increment, name varchar(40), money double ); insert into account(name,money) values('a',1000); insert into account(name,money) values('b',1000);
準備完成:rem
輸入如下SQL語句,來模擬A向B轉帳1000元:
start transaction; update account set money=money-1000 where name=’a’;
假設數據庫執行到此發生了錯誤,咱們將MySQL的命令行窗口關閉來代替這樣的「錯誤」:
這時若是咱們再從新打開MySQL命令行窗口,從新查看用戶的金額,發現因爲咱們開啓事務後,並未提交(commit),所以致使事務回滾,以前執行的SQL語句所有不算成功,所以即便數據庫可能發生了錯誤,用戶金額仍是能由事務保證不出意外:
仍是上面的例子,此次咱們在開啓事務,輸入SQL命令,最後提交事務(Commit),來確保這個事務內全部的SQL命令都能被執行成功,輸入如下SQL語句:
start transaction; update account set money=money-1000 where name=’a’; update account set money=money+1000 where name=’b’; commit;
即爲下面的樣子:
這時候即便我將MySQL命令行窗口關閉模擬提交事務後再出錯的狀況,那麼從新查詢用戶金額仍是能看出轉帳已經在出錯前確保完成了:
經過上面兩個例子能夠看出,若是咱們想將多條SQL做爲總體執行,只要有一個條SQL執行失敗或者數據庫忽然出錯就回滾到最開始執行以前的狀態,使用事務是最好的選擇。
最後來看看事務回滾(ROLLBACK)。若是咱們在事務處理的過程當中,提交事務(Commit)以前,若是想回滾以前的操做,可使用ROLLBACK這條SQL命令。
注:使用ROLLBACK命令將回滾以前到開啓事務的全部SQL語句。
仍是以上面的A與B兩個用戶的金額爲例,如今二者的金額都爲1000:
如今咱們開啓事務,執行幾條SQL命令,而後再將這些已經執行的SQL命令回滾:
使用ROLLBACK命令會回滾該事務內全部以前執行的SQL命令,不會只回滾前面一條SQL命令,所以即便咱們對A和B的金額操做了屢次,最終仍是回到事務開啓前的金額數:
以上介紹完在數據庫命令行窗口如何進行與事務相關的操做,主要就是開啓事務,提交事務和回滾事務這三種,固然做爲Java程序員,咱們應該仍是使用JDBC來操做數據庫的事務處理,這部份內容將會在下一篇博客中介紹到。