成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【Java學習】JDBC事務(wù)

weapon / 1491人閱讀

摘要:所以我們需要考慮是否關(guān)閉自動提交并且管理自己的事務(wù)。事務(wù)能夠控制何時更改提交并應(yīng)用于數(shù)據(jù)庫。并發(fā)事務(wù)可能出現(xiàn)的情況臟讀一個事務(wù)讀取另一個事務(wù)尚未提交的數(shù)據(jù)。幻讀其他事務(wù)的數(shù)據(jù)操作導致某個事務(wù)兩次讀取數(shù)據(jù)數(shù)量不一致。

概述

在開發(fā)中,我們對數(shù)據(jù)庫的多個表或?qū)σ粋€表的多條數(shù)據(jù)執(zhí)行更新操作的時候,要保證多個更新操作要么同時成功、要么都不成功。這就涉及到多個更新操作的事務(wù)管理問題了。

例如:銀行的轉(zhuǎn)賬問題,A用戶向B用戶轉(zhuǎn)賬100元,假設(shè)A用戶和B用戶的錢都存儲在Account表中,那么A向B轉(zhuǎn)賬就涉及同時更新Account表中的A用戶的錢和B用戶的錢,不然的話,A的錢少了,而B卻沒有收到錢,這是不允許出現(xiàn)的事件。

update account set money = money -100 where name = "A";
update account set money = money + 100 where name = "B";
事務(wù)

為什么上面的sql語句不能夠?qū)崿F(xiàn)“要么都成功、要么都失敗”?這是因為如果JDBC處于自動提交模式,每個SQL語句在完成后都會提交到數(shù)據(jù)庫,也就是說在執(zhí)行A扣錢(即第一條sql)語句之后,他就已經(jīng)更新了數(shù)據(jù)庫,如果這個時候程序突然崩潰,導致后面的語句沒有運行,那么就出現(xiàn)了我們說的,a扣錢了,但是b卻沒收到錢。

所以我們需要考慮是否關(guān)閉自動提交并且管理自己的事務(wù)。

事務(wù)能夠控制何時更改提交并應(yīng)用于數(shù)據(jù)庫。它將單個SQL語句或一組SQL語句視為一個邏輯單元,如果任何語句失敗,整個事務(wù)將失敗。

如上面所說,JDBC連接默認是處于自動提交,我們需要手動的打開這個功能。調(diào)用Connection對象的setAutoCommit()方法,將false傳遞給setAutoCommit(),就關(guān)閉了自動提交。也可以創(chuàng)第一個布爾值true來打開它。

conn.setAutoCommit(false);

現(xiàn)在我們知道了,想要讓多條更新語句保持原子性,首先要關(guān)閉自動提交,然后手動提交,在一個事務(wù)失敗的時候,要進行回滾。

提交和回滾

完成更改后,若要提交更改,需要在對象上調(diào)用commit()方法:

conn.commit();

否則要進行回滾

conn.rollback();

以下實例說明了如何使用提交和回滾。

try{
    conn.setAutoCommit(false);
    Statement stmt = conn.createStatement();
    
    String SQL = "INSERT INTO Employees" + "VALUES (106,20,"Rita,"Tez")";
    stmt.executeUpdate(SQL);
    
    String SQL = "IMSERT IN Employees " + "VALUES (107,22,"SITA","SINGH")";
    stmt.excuteUpdate(SQL);
    
    conn.commit();

}catuch(SQLException se){
    conn.rollback();
    
}
使用保存點

新的JDBC3.0新添加了Savepoint接口提供了額外的事務(wù)控制能力。
使用Connection對象兩個方法來創(chuàng)建Savepoint對象。

setSavepoint(String savepointName);//定義新的保存點,返回`Savepoint`對象。
releaseSavepoint(Savepoint savepointName);//刪除保存點。參數(shù)是由上面的方法生出的對象。

這樣使用rollback(String savepointName)方法,就可以將事務(wù)回滾到指定的保存點

try{
   //Assume a valid connection object conn
   conn.setAutoCommit(false);
   Statement stmt = conn.createStatement();

   //set a Savepoint
   Savepoint savepoint1 = conn.setSavepoint("Savepoint1");
   String SQL = "INSERT INTO Employees " +
                "VALUES (106, 24, "Curry", "Stephen")";
   stmt.executeUpdate(SQL);  
   //Submit a malformed SQL statement that breaks
   String SQL = "INSERTED IN Employees " +
                "VALUES (107, 32, "Kobe", "Bryant")";
   stmt.executeUpdate(SQL);
   // If there is no error, commit the changes.
   conn.commit();

}catch(SQLException se){
   // If there is any error.
   conn.rollback(savepoint1);
}
事務(wù)的隔離性

以上我們說明了,如何實現(xiàn)一個數(shù)據(jù)要么都成功,要么都失敗,這個其實是在事務(wù)中的原子性。而另一個比較重要的就是隔離性

什么是隔離性

所謂隔離性是指事務(wù)與事務(wù)之間的隔離,即在事務(wù)提交之間,其他事務(wù)中與未完成的事務(wù)的數(shù)據(jù)中間狀態(tài)訪問權(quán)限,具體可以通過設(shè)置隔離級別來進行控制。

并發(fā)事務(wù)可能出現(xiàn)的情況 臟讀

一個事務(wù)讀取另一個事務(wù)尚未提交的數(shù)據(jù)。

這個解決辦法,就是在事務(wù)進行操作的時候,禁止該事物進行讀操作。

不可重新讀

其他事務(wù)的操作導致某一個事務(wù)兩次讀取數(shù)據(jù)不一致。

幻讀

其他事務(wù)的數(shù)據(jù)操作導致某個事務(wù)兩次讀取數(shù)據(jù)數(shù)量不一致。

參考資料

JDBC應(yīng)用中的事務(wù)管理
Mysql數(shù)據(jù)庫事務(wù)在jdbc中的用法
JDBC事務(wù)和事務(wù)的隔離等級

未完待續(xù)。。。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76364.html

相關(guān)文章

  • Spring Boot - 整合JdbcTemplate、MyBatis

    摘要:更簡答的說就是要么全部執(zhí)行成功,要么撤銷不執(zhí)行。因此,數(shù)據(jù)庫操作的事務(wù)習慣上就稱為事務(wù)。實現(xiàn)原理單機事務(wù)事務(wù)是用對象控制的。接口提供了兩種事務(wù)模式自動提交和手工提交。事務(wù)多機事務(wù),通過實現(xiàn),需要驅(qū)動支持。局限于應(yīng)用使用。 Spring Boot - 數(shù)據(jù)庫配置 回顧 Spring Boot - 初識 Hello World Spring Boot - Servlet、過濾器、監(jiān)聽器、...

    Keagan 評論0 收藏0
  • Mybatis學習筆記

    摘要:學習筆記有官方的中文開發(fā)文檔并且針對使用者比較友好是一款優(yōu)秀的持久層框架,它支持定制化存儲過程以及高級映射。它只和配置有關(guān),存在的意義僅在于用來減少類完全限定名的冗余,為了簡化中的書寫。 Mybatis學習筆記 mybatis有官方的中文開發(fā)文檔并且針對使用者比較友好:http://www.mybatis.org/mybatis-3/zh/ MyBatis 是一款優(yōu)秀的持久層框架,它支...

    jsyzchen 評論0 收藏0
  • Java學習JDBC學習(了解CLass等)

    摘要:同時也有一些兒高級的處理,比如批處理更新事務(wù)隔離和可滾動結(jié)果集等。連接對象表示通信上下文,即,與數(shù)據(jù)庫中的所有的通信是通過此唯一的連接對象。因為是針對類的關(guān)系而言,所以一個對象對應(yīng)多個類的實例化。返回表示查詢返回表示其它操作。 JDBC是什么? JDBC是一個Java API,用中文可以通俗的解釋為,使用Java語言訪問訪問數(shù)據(jù)庫的一套接口集合。這是調(diào)用者(程序員)和實行者(數(shù)據(jù)庫廠商...

    cjie 評論0 收藏0
  • jdbc就是這么簡單

    摘要:使用執(zhí)行單元測試查詢獲取連接對象根據(jù)連接對象,得到執(zhí)行語句,返回遍歷結(jié)果集查詢獲取連接對象根據(jù)連接對象,得到執(zhí)行添加影響的行數(shù),,如果大于表明操作成功。否則失敗更新成功更新失敗光標選中方法名字,然后右鍵執(zhí)行單元測試。 文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關(guān)注我的微信公眾號:好好學java,獲取優(yōu)質(zhì)學習資源。 一、JDBC JAVA Database Connectivi...

    li21 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<