最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入解析Java中的JDBC事務

 更新時間:2015年08月05日 09:51:17   作者:zinss26914  
這篇文章主要介紹了深入解析Java中的JDBC事務,包含了Java多線程的事務并發(fā)等知識,需要的朋友可以參考下

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

一致性(Consistency):事務的執(zhí)行結果,必須使數(shù)據(jù)庫的從一個一致性的狀態(tài)變到另一個一致性的狀態(tài)。

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

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

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


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

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

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

舉例:

事務A、B并發(fā)執(zhí)行時:

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

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 
   
        // 執(zhí)行更新操作 
        pstmtupdate = conn.prepareStatement(updatesql); 
        pstmtupdate.executeUpdate(); 
   
        // 執(zhí)行查找操作 
        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語句執(zhí)行就會立即提交到數(shù)據(jù)庫,永久生效,無法對其進行操作。關閉Connection的自動提交,開啟事物。Connection的setAutoCommit方法即可:connection.setAutoCommit(false);通過connection.getAutoCommit()來獲取事物的模式。當我們開啟事物后,在當前Connection中完成的數(shù)據(jù)庫操作,都不會立即提交到數(shù)據(jù)庫,需要調用Connection的commit方法才行。如果有語句執(zhí)行失敗,可以調用rollback來回滾。注意:如果Connection遇到未處理的SQLException異常時,系統(tǒng)將非正常退出,系統(tǒng)會自動回滾該事務。如果程序捕捉了該異常,則需要在異常處理中顯示回滾事務。 Connection提供了設置事務中間保存點的方法:setSavepoint,有2個方法可以設置中間點:Savepoint setSavepoint():在當前事務中創(chuàng)建一個未命名的中間點,并返回該中間點的Savepoint對象。Savepoint setSavepoint(String name):當前事務中創(chuàng)建一個具有指定名稱的中間點,并返回該中間點的Savepoint對象通常setSavepoint(String name)設置中間點的名稱,事務回滾并不是通過中間點的名稱進行回滾的,而是根據(jù)中間點對象進行回滾的。設置名稱只是更好的區(qū)分中間點對象,用Connection的rollback(Savepoint savepoint)方法即可完成回滾到指定中間點。

JDBC對事務的支持體現(xiàn)在三個方面:

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

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

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

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

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

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到該保存點處的狀態(tài),而不是rollback整個事務
首先,我們來看看現(xiàn)有的JDBC操作會給我們帶來什么重大問題,比如有一個業(yè)務:當我們修改一個信息后再去查詢這個信息,看似是一個簡單的業(yè)務,實現(xiàn)起來也非常容易,但當這個業(yè)務放在多線程高并發(fā)的平臺下,問題自然就出現(xiàn)了,比如當我們執(zhí)行了一個修改后,在執(zhí)行查詢前有一個線程也執(zhí)行了修改語句,這時我們再執(zhí)行查詢,看到的信息就有可能與我們修改的不同。為了解決這一問題,我們必須引入JDBC事務機制,其實現(xiàn)代碼很簡單,給出示例代碼供大家參考:


相關文章

  • 淺談JAVA字符串匹配算法indexOf函數(shù)的實現(xiàn)方法

    淺談JAVA字符串匹配算法indexOf函數(shù)的實現(xiàn)方法

    這篇文章主要介紹了淺談字符串匹配算法indexOf函數(shù)的實現(xiàn)方法,indexOf函數(shù)我們可以查找一個字符串(模式串)是否在另一個字符串(主串)出現(xiàn)過。對此感興趣的可以來了解一下
    2020-07-07
  • struts2 中文亂碼的解決辦法分享

    struts2 中文亂碼的解決辦法分享

    這篇文章主要介紹了struts2 中文亂碼的解決辦法,需要的朋友可以參考下
    2014-02-02
  • Java使用Swing實現(xiàn)一個模擬電腦計算器

    Java使用Swing實現(xiàn)一個模擬電腦計算器

    Java Swing 是一個用于創(chuàng)建 Java GUI(圖形用戶界面)的框架,它提供了一系列的 GUI 組件和工具,可以用于創(chuàng)建桌面應用程序,包括按鈕、文本框、標簽、表格等等,本文給大家介紹了Java使用Swing實現(xiàn)一個模擬計算器,感興趣的同學可以自己動手嘗試一下
    2024-05-05
  • Oracle + Mybatis實現(xiàn)批量插入、更新和刪除示例代碼

    Oracle + Mybatis實現(xiàn)批量插入、更新和刪除示例代碼

    利用MyBatis動態(tài)SQL的特性,我們可以做一些批量的操作,下面這篇文章主要給大家介紹了關于Oracle + Mybatis實現(xiàn)批量插入、更新和刪除的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-01-01
  • 如何解決Springboot?Dao注入失敗的問題

    如何解決Springboot?Dao注入失敗的問題

    這篇文章主要介紹了如何解決Spring?boot?Dao注入失敗的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 基于springboot的flowable工作流實戰(zhàn)流程分析

    基于springboot的flowable工作流實戰(zhàn)流程分析

    這篇文章主要介紹了基于springboot的flowable工作流實戰(zhàn)流程分析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • 關于使用ContextClassLoader遇到的問題

    關于使用ContextClassLoader遇到的問題

    這篇文章主要介紹了關于使用ContextClassLoader遇到的問題,ContextClassLoader是通過Thread.currentThread().getContextClassLoader()返回該線程上下文的ClassLoader,需要的朋友可以參考下
    2023-10-10
  • java8 Stream流逐行處理文本文件

    java8 Stream流逐行處理文本文件

    這篇文章主要介紹了java8 Stream流逐行處理文本文件的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • Java解析調用webservice服務的返回XML串詳解

    Java解析調用webservice服務的返回XML串詳解

    這篇文章主要介紹了Java解析調用webservice服務的返回XML串詳解的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Java中常用阻塞隊列的問題小結

    Java中常用阻塞隊列的問題小結

    這篇文章主要介紹了Java常用阻塞隊列問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01

最新評論

璧山县| 小金县| 东乡族自治县| 定边县| 日照市| 阜宁县| 河曲县| 寿阳县| 阳春市| 临安市| 崇礼县| 淮南市| 公安县| 图片| 德清县| 鄯善县| 龙泉市| 湖南省| 边坝县| 平潭县| 四平市| 中阳县| 宿迁市| 富顺县| 绵竹市| 海宁市| 子洲县| 麻江县| 沙坪坝区| 宿迁市| 丁青县| 十堰市| 乡宁县| 鹤山市| 平武县| 旬阳县| 安义县| 额尔古纳市| 博湖县| 新郑市| 翼城县|