亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

深入解析Java中的JDBC事務

2019-11-26 15:01:39
字體:
來源:轉載
供稿:網友

事務
事務是一步或多步組成操作序列組成的邏輯執行單元,這個序列要么全部執行,要么則全部放棄執行。事務的四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(IsoIation)和持續性(Durability)原子性(Atomicity):事務應用最小的執行單元,不可再分。是事務中不可再分的最小邏輯執行體。

一致性(Consistency):事務的執行結果,必須使數據庫的從一個一致性的狀態變到另一個一致性的狀態。

隔離線(IsoIation):各個事務的執行互不干擾,任意一個事務的內部操作對其他并發的事務,都是隔離的。也就是:并發執行的事務之間不能看到對方的中間狀態,并發執行的事務之間不能互相影響。

持續性(Durability):持續性也稱為持久性(Persistence),指事務一旦提交,對數據所做的任何改變,都要記錄到永久存儲器中,通常就是保存在物理數據庫中。

通常數據庫的事務涉及到的語句有:一組DML(Data Munipulation Language,數據操作語言)語句,這組DML語句修改后數據將保持較好的一致性;    操作表的語句,如插入、修改、刪除等;一個DDL(Data Definition Language,數據定義語言)語句,操作數據對象的語言,有create、alter、drop。一個DCL(Data Control Language,數據控制語言)語句,主要有grant、revoke語句。 DDL和DCL語句最多只能有一個,因為它們都會導致事務的立即提交。當事務所包含的全部數據庫操作都成功執行后,應該提交事務,使這些修改永久生效。事務提交有兩種方式:顯示提交和自動提交。顯示提交:使用commit提交自動提交:執行DLL或DCL,或者程序正常退出 當事務包含的任意一個數據庫操作執行失敗后,應該回滾(rollback)事務,使該事務中所作的修改全部失效。事務的回滾方式有兩種:顯示回滾和自動回滾。顯示回滾:使用rollback自動回滾:系統錯誤或強行退出。


事務并發處理可能的問題
1、臟讀(dirty read):一個事務讀取了另一個事務尚未提交的數據

2、不可重復讀(non-repeatable read):一個事務的操作導致另一個事務前后兩次讀到不同的數據

3、幻讀(phantom read):一個事務的操作導致另一個事務前后兩次查詢的結果數據量不同

舉例:

事務A、B并發執行時:

  •     當A事務update后,B事務select讀取到A尚未提交的數據,此時A事務rollback,則B讀到的數據是無效的臟數據
  •     當B事務select讀取數據后,A事務update操作更改B事務select到的數據,此時B事務再次讀取該數據,發現前后兩次的數據不一樣
  •     當B事務select讀取數據后,A事務insert或delete了一條滿足A事務的select條件的記錄,此時B事務再次select,發現查詢到前次不存在的記錄,或者前次的某個記錄不見了

Java JDBC事務機制
  

 import java.sql.Connection;   import java.sql.DriverManager;   import java.sql.PreparedStatement;   import java.sql.SQLException;         public class JDBCTransaction {     public static final String URL = "com.mysql.jdbc.Driver";     public static final String USER = "root";     public static final String PASSWD = "123456";        public static void jdbcTransaction(int id) {       Connection conn = null;       PreparedStatement pstmtupdate = null;       PreparedStatement pstmtquery = null;       String updatesql = "更新sql";       String querysql = "查詢sql";          try {         Class.forName("com.mysql.jdbc.Driver");         conn = DriverManager.getConnection(URL, USER, PASSWD);            conn.setAutoCommit(false); // 自動提交設置為false            // 執行更新操作         pstmtupdate = conn.prepareStatement(updatesql);         pstmtupdate.executeUpdate();            // 執行查找操作         pstmtquery = conn.prepareStatement(querysql);         pstmtquery.executeQuery();            conn.commit();         conn.setAutoCommit(true);            pstmtupdate.close();         pstmtquery.close();         conn.close();       } catch (Exception e) {         try {           conn.rollback();         } catch (SQLException e1) {}         e.printStackTrace();       } finally {         try {           if (pstmtupdate != null) {             pstmtupdate.close();           }              if (pstmtquery != null) {             pstmtquery.close();           }              if (conn != null) {             conn.close();           }         } catch (SQLException e2) {}       }     }   } 


JDBC的事務支持

JDBC的Connection也支持事物,Connection默認打開自動提交,即關閉事物。也就是說,每條SQL語句執行就會立即提交到數據庫,永久生效,無法對其進行操作。關閉Connection的自動提交,開啟事物。Connection的setAutoCommit方法即可:connection.setAutoCommit(false);通過connection.getAutoCommit()來獲取事物的模式。當我們開啟事物后,在當前Connection中完成的數據庫操作,都不會立即提交到數據庫,需要調用Connection的commit方法才行。如果有語句執行失敗,可以調用rollback來回滾。注意:如果Connection遇到未處理的SQLException異常時,系統將非正常退出,系統會自動回滾該事務。如果程序捕捉了該異常,則需要在異常處理中顯示回滾事務。 Connection提供了設置事務中間保存點的方法:setSavepoint,有2個方法可以設置中間點:Savepoint setSavepoint():在當前事務中創建一個未命名的中間點,并返回該中間點的Savepoint對象。Savepoint setSavepoint(String name):當前事務中創建一個具有指定名稱的中間點,并返回該中間點的Savepoint對象通常setSavepoint(String name)設置中間點的名稱,事務回滾并不是通過中間點的名稱進行回滾的,而是根據中間點對象進行回滾的。設置名稱只是更好的區分中間點對象,用Connection的rollback(Savepoint savepoint)方法即可完成回滾到指定中間點。

JDBC對事務的支持體現在三個方面:

1、自動提交模式(auto-commit mode)

Connection提供了一個auto-commit屬性來指定事務何時結束

2、當auto-commit為true時,當每個獨立SQL操作的執行完畢,事務立即自動提交,也就是說每個SQL操作都是一個事務

一個獨立SQL操作什么時候算執行完畢,JDBC規范是這樣定義的:

對數據操作語言(DML)和數據定義語言(DDL),語句一執行完就視為執行完畢

3、當auto-commit為false時,每個事務都必須顯示調用commit方法進行提交,或者顯示調用rollback方法進行回滾。auto-commit默認為true

事務隔離級別(Transaction Isolation Levels)
JDBC定義了五種事務隔離級別:

  1.     TRANSACTION_NONE JDBC驅動不支持事務
  2.     TRANSACTION_READ_UNCOMMITTED 允許臟讀、不可重復讀和幻讀
  3.     TRANSACTION_READ_COMMITTED 禁止臟讀,但允許不可重復讀和幻讀
  4.     TRANSACTION_REPEATABLE_READ 禁止臟讀和不可重復讀,單運行幻讀
  5.     TRANSACTION_SERIALIZABLE 禁止臟讀、不可重復讀和幻讀


保存點
JDBC定義了SavePoint接口,提供一個更細粒度的事務控制機制。當設置了一個保存點后,可以rollback到該保存點處的狀態,而不是rollback整個事務
首先,我們來看看現有的JDBC操作會給我們帶來什么重大問題,比如有一個業務:當我們修改一個信息后再去查詢這個信息,看似是一個簡單的業務,實現起來也非常容易,但當這個業務放在多線程高并發的平臺下,問題自然就出現了,比如當我們執行了一個修改后,在執行查詢前有一個線程也執行了修改語句,這時我們再執行查詢,看到的信息就有可能與我們修改的不同。為了解決這一問題,我們必須引入JDBC事務機制,其實現代碼很簡單,給出示例代碼供大家參考:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品无码久久久久久国产| 国产欧美日韩91| 国产亚洲一级高清| 5278欧美一区二区三区| 美女福利视频一区| 黄色一区二区在线观看| 成人黄色大片在线免费观看| 日韩免费中文字幕| 午夜精品一区二区三区在线播放| 国产999精品| 亚洲欧洲偷拍精品| 欧美性猛交xxxx偷拍洗澡| 欧美理论电影在线观看| 国产精品青草久久久久福利99| 丝袜亚洲欧美日韩综合| 日韩精品视频在线观看免费| 亚洲国产精品成人va在线观看| 成人精品一区二区三区| 国产91精品网站| 国产精品海角社区在线观看| 亚洲资源在线看| 欧美激情高清视频| 96sao精品视频在线观看| 在线视频国产日韩| 日韩在线一区二区三区免费视频| 日本成人在线视频网址| 4444欧美成人kkkk| 国产97在线|日韩| 久久久精品中文字幕| 国产91精品不卡视频| 欧美视频一二三| 欧美成人精品激情在线观看| 久久久av亚洲男天堂| 亚洲男子天堂网| 亚洲专区中文字幕| 91精品91久久久久久| 亚洲久久久久久久久久久| 精品国偷自产在线视频| 日本久久中文字幕| 一区二区三区国产视频| 国产精品人成电影在线观看| 高清视频欧美一级| 日韩av男人的天堂| 国产精品久久久久久久久久新婚| 国产精品欧美一区二区三区奶水| 午夜欧美大片免费观看| 欧美午夜激情在线| 狠狠色狠狠色综合日日小说| 91深夜福利视频| 国产成人精彩在线视频九色| 精品亚洲国产视频| 欧美中文字幕在线| 久久久久久久999| 日本久久久久久| 欧美性在线观看| 91免费高清视频| www国产精品视频| 欧美午夜丰满在线18影院| 91精品久久久久久久| 国产精品日韩欧美大师| 亚洲精品一区二三区不卡| 韩国19禁主播vip福利视频| 国产精品美女主播| 色七七影院综合| 久久91精品国产| 亚洲国产日韩欧美在线99| 日韩在线观看免费网站| 一本一本久久a久久精品牛牛影视| 亚洲一区二区自拍| 亚洲午夜精品久久久久久性色| 欧美激情在线观看视频| 欧美日韩一二三四五区| 国产精品欧美日韩久久| 亚洲欧美精品一区二区| 欧美一级视频在线观看| 久久成人av网站| 国产精品福利观看| 日韩av第一页| 中文字幕在线观看日韩| 欧美极品第一页| 欧美高清视频在线播放| 国产精品久久久久久网站| 欧美激情成人在线视频| 午夜精品三级视频福利| 高清欧美一区二区三区| 国产日韩欧美在线观看| 欧美精品成人91久久久久久久| 亚洲男人的天堂在线播放| 日韩欧美国产激情| 欧美俄罗斯性视频| 久久99久久99精品中文字幕| 日韩av免费看| 亚洲精品欧美日韩专区| 久久99精品久久久久久青青91| 久久亚洲国产成人| 精品国产福利在线| 欧美性猛交xxxx| 97精品国产97久久久久久春色| 久久久久成人精品| 综合久久五月天| 亚洲va男人天堂| 91网站免费观看| 欧美乱人伦中文字幕在线| 国产成人亚洲精品| 欧美性视频在线| 国产精品成人一区二区| 欧美中文字幕视频| 一本色道久久88综合日韩精品| 日韩视频第一页| 亚洲精品乱码久久久久久金桔影视| 成人做爰www免费看视频网站| 欧美成人精品在线播放| 日韩av免费看| 日韩视频永久免费观看| 亚洲成人网在线| 精品美女永久免费视频| 欧美极品美女视频网站在线观看免费| 国产精品久久久久久久9999| 日韩高清欧美高清| 欧美一区二区色| 91影院在线免费观看视频| 日韩中文字幕在线免费观看| 亚洲自拍欧美另类| 久久好看免费视频| 亚洲成人激情小说| 国产精品成人国产乱一区| 国产亚洲成av人片在线观看桃| 国产成人高清激情视频在线观看| 午夜精品一区二区三区av| 午夜精品一区二区三区在线| 精品视频在线观看日韩| 欧美成人一区在线| 国产日韩精品一区二区| 国产美女久久精品| 成人精品久久一区二区三区| 欧美—级高清免费播放| 日韩在线观看免费| 北条麻妃久久精品| 69久久夜色精品国产69| 亚洲国产婷婷香蕉久久久久久| 国产精品电影网站| 亚洲精品99999| 日韩欧美在线视频免费观看| 日韩精品极品在线观看| 日本精品视频在线播放| 久久亚洲国产精品| 国产精品老女人视频| 欧美另类高清videos| 91精品国产一区| 久久亚洲成人精品| 久久综合色影院| 亚洲最大的av网站| 精品欧美一区二区三区| 国产亚洲免费的视频看| 亚洲视频网站在线观看| 欧美性极品xxxx做受| 欧美成人免费大片| 色99之美女主播在线视频| 亚洲国产欧美自拍| 日韩av免费在线播放| 国产成人精品在线视频| 国产999精品久久久| 韩曰欧美视频免费观看| 92国产精品视频|