程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 深刻解析Java中的JDBC事務

深刻解析Java中的JDBC事務

編輯:關於JAVA

深刻解析Java中的JDBC事務。本站提示廣大學習愛好者:(深刻解析Java中的JDBC事務)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析Java中的JDBC事務正文


事務
事務是一步或多步構成操作序列構成的邏輯履行單位,這個序列要末全體履行,要末則全體廢棄履行。事務的四個特征:原子性(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 制止髒讀、弗成反復讀和幻讀

  6. 保留點
    JDBC界說了SavePoint接口,供給一個更細粒度的事務掌握機制。當設置了一個保留點後,可以rollback到該保留點處的狀況,而不是rollback全部事務
    起首,我們來看看現有的JDBC操作會給我們帶來甚麼嚴重成績,好比有一個營業:當我們修正一個信息後再去查詢這個信息,看似是一個簡略的營業,完成起來也異常輕易,但當這個營業放在多線程高並發的平台下,成績天然就湧現了,好比當我們履行了一個修正後,在履行查詢前有一個線程也履行了修正語句,這時候我們再履行查詢,看到的信息就有能夠與我們修正的分歧。為懂得決這一成績,我們必需引入JDBC事務機制,其完成代碼很簡略,給出示例代碼供年夜家參考:


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved