JDBC:數據庫操作:事務


事務特征:原子性,一致性,獨立性,持久性。

要想操作事務,必須按照以下步驟完成。

1,取消掉自動提交(SET AUTOCOMMIT=0):每次執行數據庫更新的時候實際上發出SQL命令之后就已經提交上去了。

2,開始事務,

3,進行一系列操作

4,如果操作一切合格,則提交事務,

5,如果發現一個地方有問題,則可以回滾,

6,或者設置一個SAVEPOINT保存事務提交點。

在JDBC中,同樣支持事務的處理操作。

一,不使用事務處理情況。

通過批處理插入數據:

package 類集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.Statement ;
public class TranDemo01{
    // 定義MySQL的數據庫驅動程序
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
    // 定義MySQL數據庫的連接地址
    public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
    // MySQL數據庫的連接用戶名
    public static final String DBUSER = "root" ;
    // MySQL數據庫的連接密碼
    public static final String DBPASS = "aaaaaa" ;
    public static void main(String args[]) throws Exception{    // 所有異常拋出
        Connection conn = null ;        // 數據庫連接
        Statement stmt = null ;        // 定義數據庫操作
        Class.forName(DBDRIVER) ;    // 加載驅動程序
        conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
        stmt = conn.createStatement() ;
        stmt.addBatch("INSERT INTO user(name,age,birthday)" +
            " VALUES ('LXH-1',11,'1975-03-05') ") ;
        stmt.addBatch("INSERT INTO user(name,age,birthday)" +
            " VALUES ('LXH-2',12,'1976-03-05') ") ;
        // 加入“'”之后,此SQL語法就出現了錯誤,所以,肯定執行到此語句的時候出現代碼錯誤
        stmt.addBatch("INSERT INTO user(name,age,birthday)" +
            " VALUES ('LXH-'3',13,'1977-06-01') ") ;
        stmt.addBatch("INSERT INTO user(name,age,birthday)" +
            " VALUES ('LXH-4',14,'1965-03-05') ") ;
        int temp[] = stmt.executeBatch() ;  //返回更新數據量
        System.out.println("更新了:" + temp.length+ "條數據。") ;
        stmt.close() ;
        conn.close() ;            // 數據庫關閉
    }
};

運行結果:

Sun Apr 23 00:09:39 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Exception in thread "main" java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '3',13,'1977-06-01')' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.Util.getInstance(Util.java:408)
    at com.mysql.jdbc.SQLError.createBatchUpdateException(SQLError.java:1162)
    at com.mysql.jdbc.StatementImpl.executeBatchInternal(StatementImpl.java:1048)
    at com.mysql.jdbc.StatementImpl.executeBatch(StatementImpl.java:958)
at 類集.TranDemo01.main(TranDemo01.java:
29)

查詢數據庫:

發現,雖然程序報錯了,但是批處理中其他語句卻執行成功了。

以上操作只將錯誤數據空出,如果這5條記錄有相互關系,則這樣實現肯定不符合要求。

 

JDBC事務處理操作步驟

事務處理代碼:

package 類集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.Statement ;
public class TranDemo02{
    // 定義MySQL的數據庫驅動程序
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
    // 定義MySQL數據庫的連接地址
    public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
    // MySQL數據庫的連接用戶名
    public static final String DBUSER = "root" ;
    // MySQL數據庫的連接密碼
    public static final String DBPASS = "aaaaaa" ;
    public static void main(String args[]) throws Exception{    // 所有異常拋出
        Connection conn = null ;        // 數據庫連接
        Statement stmt = null ;        // 定義數據庫操作
        Class.forName(DBDRIVER) ;    // 加載驅動程序
        conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;

        conn.setAutoCommit(false) ; // 取消掉自動提交
 stmt = conn.createStatement() ; stmt.addBatch("INSERT INTO user(name,age,birthday)" +
                " VALUES ('LXH-1',11,'1975-03-05') ") ;
            stmt.addBatch("INSERT INTO user(name,age,birthday)" +
                " VALUES ('LXH-2',12,'1976-03-05') ") ;
            // 加入“'”之后,此SQL語法就出現了錯誤,所以,肯定執行到此語句的時候出現代碼錯誤
            stmt.addBatch("INSERT INTO user(name,age,birthday)" +
                " VALUES ('LXH-'3',13,'1977-06-01') ") ;
            stmt.addBatch("INSERT INTO user(name,age,birthday)" +
                " VALUES ('LXH-4',14,'1965-03-05') ") ;
        try{ int temp[] = stmt.executeBatch() ;
            System.out.println("更新了:" + temp.length+ "條數據。") ;
            conn.commit() ;    // 所有的操作成功了
        }catch(Exception e){  try{  conn.rollback() ;
          System.out.println("數據更新失敗"); }
catch(Exception e1){ } } stmt.close() ; conn.close() ; // 數據庫關閉 } };

運行結果:

Sun Apr 23 00:20:38 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
數據更新失敗

數據庫查詢:

可以發現並沒有插入為報錯的數據。

 

SAVEPOINT:

正常情況下,可以通過SAVEPOINT保存事務的操作點,默認情況下,回滾是將所有操作取消掉,而通過SAVEPOINT可以設置回退的位置。

一個Sessions的操作(每一個連接到數據庫上的用戶都稱為一個Session)

操作1,

操作2

操作3,

SAVEPOINT 記錄點1

操作4

操作5 

RALLBACK 記錄點1.

設置SAVEPOINT

 Savepoint setSavepoint() 在當前事務中創建一個未命名的保存點 (savepoint),並返回表示它的新 Savepoint 對象。 

實例代碼:

package 類集;
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.Statement ;
import java.sql.Savepoint ;
public class TranDemo03{
    // 定義MySQL的數據庫驅動程序
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
    // 定義MySQL數據庫的連接地址
    public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ;
    // MySQL數據庫的連接用戶名
    public static final String DBUSER = "root" ;
    // MySQL數據庫的連接密碼
    public static final String DBPASS = "aaaaaa" ;
    public static void main(String args[]) throws Exception{    // 所有異常拋出
        Connection conn = null ;        // 數據庫連接
        Statement stmt = null ;        // 定義數據庫操作
        Class.forName(DBDRIVER) ;    // 加載驅動程序
        conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;

        conn.setAutoCommit(false) ;    // 取消掉自動提交

        stmt = conn.createStatement() ;
        stmt.executeUpdate("INSERT INTO user(name,age,birthday)" +
            " VALUES ('LXH-1',11,'1975-03-05') ") ;
        stmt.executeUpdate("INSERT INTO user(name,age,birthday)" +
            " VALUES ('LXH-2',12,'1976-03-05') ") ;
        Savepoint sp = conn.setSavepoint() ; // 設置保存點
        
        stmt.executeUpdate("INSERT INTO user(name,age,birthday)" +
            " VALUES ('LXH-4',14,'1965-03-05') ") ;
        stmt.executeUpdate("INSERT INTO user(name,age,birthday)" +
            " VALUES ('LXH-5',15,'1965-08-05') ") ;
        try{
            conn.rollback(sp) ; // 回滾到保存點
            conn.commit() ;    // 所有的操作成功了
       System.out.println("程序出錯,已經回滾到保存點。");
}catch(Exception e){ e.printStackTrace() ; } stmt.close() ; conn.close() ; // 數據庫關閉 } };

程序結果:

Sun Apr 23 00:34:43 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
程序出錯,已經回滾到保存點。

數據庫查詢:

可以發現,因為發生錯誤,所以發生回滾,回滾到保存點,保存點之前的數據都正常更新,之后的數據沒有正常插入。

 

總結

事務的基本概念

如果數據庫中處理事務

處理事務的步驟:1,取消提交,2,執行多條SQL語句。3,如果沒有異常就提交事務。否則回滾。

保存點很少使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM