国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【Java學(xué)習(xí)】JDBC事務(wù)

weapon / 1475人閱讀

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

概述

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

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

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

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

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

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

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

conn.setAutoCommit(false);

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

提交和回滾

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

conn.commit();

否則要進(jìn)行回滾

conn.rollback();

以下實(shí)例說(shuō)明了如何使用提交和回滾。

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();
    
}
使用保存點(diǎn)

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

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

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

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ù)的隔離性

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

什么是隔離性

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

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

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

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

不可重新讀

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

幻讀

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

參考資料

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

未完待續(xù)。。。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/76364.html

相關(guān)文章

  • Spring Boot - 整合JdbcTemplate、MyBatis

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

    Keagan 評(píng)論0 收藏0
  • Mybatis學(xué)習(xí)筆記

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

    jsyzchen 評(píng)論0 收藏0
  • Java學(xué)習(xí)JDBC學(xué)習(xí)(了解CLass等)

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

    cjie 評(píng)論0 收藏0
  • jdbc就是這么簡(jiǎn)單

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

    li21 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<