使用JDBC進行數據庫的事務操作(1)


  本篇講述數據庫中非常重要的事務概念和如何使用MySQL命令行窗口來進行數據庫的事務操作。下一篇會講述如何使用JDBC進行數據庫的事務操作。

  事務是指數據庫中的一組邏輯操作,這個操作的特點就是在該組邏輯中,所有的操作要么全部成功,要么全部失敗。在各個數據具有特別緊密的聯系時,最好是使用數據庫的事務來完成邏輯處理。

  例如路人甲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操作全部失敗,保證所有人的金額不變。

  MySQL數據庫默認事務是自動提交的,也就是發一條SQL數據庫就執行一條。如果想將多條SQL放置在一個事務中執行,就必須使用如下語句:

    start  transaction sql1 sql2 … commit

  當開啟事務后(start transaction),無論數據庫是否對其中的多條SQL語句是否執行成功,只要沒有提交事務(commit),都會將之前執行的SQL進行回滾。使數據回到開啟事務之前的值。

  在MySQL中,與事務相關的有開啟事務(START TRANSACTION),提交事務(COMMIT),回滾事務(ROLLBACK)等等,下面將依次使用到。

  接下來將會在先使用數據庫命令行窗口來進行事務操作的案例。

  首先定義表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);

准備完成:

  

⑴ 開啟事務,先來模擬轉賬“失敗”的情況:

  輸入以下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執行失敗或者數據庫突然出錯就回滾到最開始執行之前的狀態,使用事務是最好的選擇。

⑶ 回滾事務,將之前所有已執行的SQL全部視為無效:

  最后來看看事務回滾(ROLLBACK)。如果我們在事務處理的過程中,提交事務(Commit)之前,如果想回滾之前的操作,可以使用ROLLBACK這條SQL命令。

  注:使用ROLLBACK命令將回滾之前到開啟事務的所有SQL語句。

還是以上面的A與B兩個用戶的金額為例,現在兩者的金額都為1000:

  

現在我們開啟事務,執行幾條SQL命令,然后再將這些已經執行的SQL命令回滾:

  

使用ROLLBACK命令會回滾該事務內所有之前執行的SQL命令,不會只回滾前面一條SQL命令,因此即使我們對A和B的金額操作了多次,最終還是回到事務開啟前的金額數:

  

  以上介紹完在數據庫命令行窗口如何進行與事務相關的操作,主要就是開啟事務,提交事務和回滾事務這三種,當然作為Java程序員,我們應該還是使用JDBC來操作數據庫的事務處理,這部分內容將會在下一篇博客中介紹到。

 

 

            

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM