摘要:所以我們需要考慮是否關閉自動提交并且管理自己的事務。事務能夠控制何時更改提交并應用于數據庫。并發事務可能出現的情況臟讀一個事務讀取另一個事務尚未提交的數據。幻讀其他事務的數據操作導致某個事務兩次讀取數據數量不一致。
概述
在開發中,我們對數據庫的多個表或對一個表的多條數據執行更新操作的時候,要保證多個更新操作要么同時成功、要么都不成功。這就涉及到多個更新操作的事務管理問題了。
例如:銀行的轉賬問題,A用戶向B用戶轉賬100元,假設A用戶和B用戶的錢都存儲在Account表中,那么A向B轉賬就涉及同時更新Account表中的A用戶的錢和B用戶的錢,不然的話,A的錢少了,而B卻沒有收到錢,這是不允許出現的事件。
update account set money = money -100 where name = "A"; update account set money = money + 100 where name = "B";事務
為什么上面的sql語句不能夠實現“要么都成功、要么都失敗”?這是因為如果JDBC處于自動提交模式,每個SQL語句在完成后都會提交到數據庫,也就是說在執行A扣錢(即第一條sql)語句之后,他就已經更新了數據庫,如果這個時候程序突然崩潰,導致后面的語句沒有運行,那么就出現了我們說的,a扣錢了,但是b卻沒收到錢。
所以我們需要考慮是否關閉自動提交并且管理自己的事務。
事務能夠控制何時更改提交并應用于數據庫。它將單個SQL語句或一組SQL語句視為一個邏輯單元,如果任何語句失敗,整個事務將失敗。
如上面所說,JDBC連接默認是處于自動提交,我們需要手動的打開這個功能。調用Connection對象的setAutoCommit()方法,將false傳遞給setAutoCommit(),就關閉了自動提交。也可以創第一個布爾值true來打開它。
conn.setAutoCommit(false);
現在我們知道了,想要讓多條更新語句保持原子性,首先要關閉自動提交,然后手動提交,在一個事務失敗的時候,要進行回滾。
提交和回滾完成更改后,若要提交更改,需要在對象上調用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接口提供了額外的事務控制能力。
使用Connection對象兩個方法來創建Savepoint對象。
setSavepoint(String savepointName);//定義新的保存點,返回`Savepoint`對象。 releaseSavepoint(Savepoint savepointName);//刪除保存點。參數是由上面的方法生出的對象。
這樣使用rollback(String savepointName)方法,就可以將事務回滾到指定的保存點
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); }事務的隔離性
以上我們說明了,如何實現一個數據要么都成功,要么都失敗,這個其實是在事務中的原子性。而另一個比較重要的就是隔離性
什么是隔離性所謂隔離性是指事務與事務之間的隔離,即在事務提交之間,其他事務中與未完成的事務的數據中間狀態訪問權限,具體可以通過設置隔離級別來進行控制。
并發事務可能出現的情況 臟讀一個事務讀取另一個事務尚未提交的數據。
這個解決辦法,就是在事務進行操作的時候,禁止該事物進行讀操作。
不可重新讀其他事務的操作導致某一個事務兩次讀取數據不一致。
幻讀其他事務的數據操作導致某個事務兩次讀取數據數量不一致。
參考資料JDBC應用中的事務管理
Mysql數據庫事務在jdbc中的用法
JDBC事務和事務的隔離等級
未完待續。。。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76364.html
摘要:更簡答的說就是要么全部執行成功,要么撤銷不執行。因此,數據庫操作的事務習慣上就稱為事務。實現原理單機事務事務是用對象控制的。接口提供了兩種事務模式自動提交和手工提交。事務多機事務,通過實現,需要驅動支持。局限于應用使用。 Spring Boot - 數據庫配置 回顧 Spring Boot - 初識 Hello World Spring Boot - Servlet、過濾器、監聽器、...
摘要:學習筆記有官方的中文開發文檔并且針對使用者比較友好是一款優秀的持久層框架,它支持定制化存儲過程以及高級映射。它只和配置有關,存在的意義僅在于用來減少類完全限定名的冗余,為了簡化中的書寫。 Mybatis學習筆記 mybatis有官方的中文開發文檔并且針對使用者比較友好:http://www.mybatis.org/mybatis-3/zh/ MyBatis 是一款優秀的持久層框架,它支...
摘要:同時也有一些兒高級的處理,比如批處理更新事務隔離和可滾動結果集等。連接對象表示通信上下文,即,與數據庫中的所有的通信是通過此唯一的連接對象。因為是針對類的關系而言,所以一個對象對應多個類的實例化。返回表示查詢返回表示其它操作。 JDBC是什么? JDBC是一個Java API,用中文可以通俗的解釋為,使用Java語言訪問訪問數據庫的一套接口集合。這是調用者(程序員)和實行者(數據庫廠商...
摘要:使用執行單元測試查詢獲取連接對象根據連接對象,得到執行語句,返回遍歷結果集查詢獲取連接對象根據連接對象,得到執行添加影響的行數,,如果大于表明操作成功。否則失敗更新成功更新失敗光標選中方法名字,然后右鍵執行單元測試。 文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:好好學java,獲取優質學習資源。 一、JDBC JAVA Database Connectivi...
閱讀 1677·2023-04-26 00:30
閱讀 3150·2021-11-25 09:43
閱讀 2877·2021-11-22 14:56
閱讀 3186·2021-11-04 16:15
閱讀 1143·2021-09-07 09:58
閱讀 2021·2019-08-29 13:14
閱讀 3109·2019-08-29 12:55
閱讀 987·2019-08-29 10:57