摘要:所以我們需要考慮是否關(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
摘要:更簡答的說就是要么全部執(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)聽器、...
摘要:學習筆記有官方的中文開發(fā)文檔并且針對使用者比較友好是一款優(yōu)秀的持久層框架,它支持定制化存儲過程以及高級映射。它只和配置有關(guān),存在的意義僅在于用來減少類完全限定名的冗余,為了簡化中的書寫。 Mybatis學習筆記 mybatis有官方的中文開發(fā)文檔并且針對使用者比較友好:http://www.mybatis.org/mybatis-3/zh/ MyBatis 是一款優(yōu)秀的持久層框架,它支...
摘要:同時也有一些兒高級的處理,比如批處理更新事務(wù)隔離和可滾動結(jié)果集等。連接對象表示通信上下文,即,與數(shù)據(jù)庫中的所有的通信是通過此唯一的連接對象。因為是針對類的關(guān)系而言,所以一個對象對應(yīng)多個類的實例化。返回表示查詢返回表示其它操作。 JDBC是什么? JDBC是一個Java API,用中文可以通俗的解釋為,使用Java語言訪問訪問數(shù)據(jù)庫的一套接口集合。這是調(diào)用者(程序員)和實行者(數(shù)據(jù)庫廠商...
摘要:使用執(zhí)行單元測試查詢獲取連接對象根據(jù)連接對象,得到執(zhí)行語句,返回遍歷結(jié)果集查詢獲取連接對象根據(jù)連接對象,得到執(zhí)行添加影響的行數(shù),,如果大于表明操作成功。否則失敗更新成功更新失敗光標選中方法名字,然后右鍵執(zhí)行單元測試。 文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關(guān)注我的微信公眾號:好好學java,獲取優(yōu)質(zhì)學習資源。 一、JDBC JAVA Database Connectivi...
閱讀 1760·2023-04-26 00:30
閱讀 3180·2021-11-25 09:43
閱讀 2915·2021-11-22 14:56
閱讀 3218·2021-11-04 16:15
閱讀 1188·2021-09-07 09:58
閱讀 2052·2019-08-29 13:14
閱讀 3138·2019-08-29 12:55
閱讀 1019·2019-08-29 10:57