1. 程式人生 > 其它 >JDBC事務處理

JDBC事務處理

簡單概念:要麼都成功,要麼都失敗

ACID原則:保證資料的安全

開啟事務
事務提交  commit()
事務回滾  rollback()
關閉事務

轉賬:
A:1000
B:1000

A(900)   ---100-->    B(1100)

Junit單元測試

依賴

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>

簡單實用

@Test註解只有在方法上有效,只要加了這個註解的方法,就可以直接執行!

import org.junit.Test;

public class JdbcACID {

    @Test
    public void T() {
        System.out.println("SUCCESS!!!!!");
    }
}

新建表並插入資料

CREATE TABLE `account`(
  `id` INT PRIMARY KEY,
  `name` VARCHAR(50) NOT NULL,
  `money` FLOAT NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO `account` (`id`, `name`, `money`) VALUES(1,'A',1000);
INSERT INTO `account` (`id`, `name`, `money`) VALUES(2,'B',1000);
INSERT INTO `account` (`id`, `name`, `money`) VALUES(3,'C',1000);

# 開啟事務
start transaction ;

# 模擬轉賬

update account set money=money-100 where name='A';

update account set money=money+100 where name='B';

# 回滾
rollback ;

# 提交
commit;

測試程式碼(製造異常事件)

    @Test
    public void T(){
        //獲取配置資訊
        //解決中文亂碼
        String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username="root";
        String password="6113081";
        //提出物件
        Connection connection=null;
        //1.載入驅動
        try {
            //1.載入驅動
            Class.forName("com.mysql.jdbc.Driver");
            //2.連結資料庫,其物件就代表了資料庫(不安全)
            connection = DriverManager.getConnection(url, username, password);
            //通知資料庫開啟事務false開啟true是關閉
            connection.setAutoCommit(false);
            //預編譯開啟安全的資料庫連線,進行資料庫操作
            String sql1="update account set money=money-100 where name='A'";
            connection.prepareStatement(sql1).executeUpdate();
            //此時製造錯誤
            int i=1/0;

            String sql2="update account set money=money+100 where name='B'";
            connection.prepareStatement(sql2).executeUpdate();
            //提交事務
            connection.commit();//以上兩條sql都提交成功就會提交事務,否則進入catch語句執行回滾
            System.out.println("SUCCESS!!!!!!");
        } catch (Exception e) {
            try {
                //出現異常事務提交終止,回滾資料
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            //關閉連線釋放資源(一定要做)先開的後關
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

輸出結果

資料庫變化

測試程式碼(消除異常事件)

    @Test
    public void T(){
        //獲取配置資訊
        //解決中文亂碼
        String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username="root";
        String password="6113081";
        //提出物件
        Connection connection=null;
        //1.載入驅動
        try {
            //1.載入驅動
            Class.forName("com.mysql.jdbc.Driver");
            //2.連結資料庫,其物件就代表了資料庫(不安全)
            connection = DriverManager.getConnection(url, username, password);
            //通知資料庫開啟事務false開啟true是關閉
            connection.setAutoCommit(false);
            //預編譯開啟安全的資料庫連線,進行資料庫操作
            String sql1="update account set money=money-100 where name='A'";
            connection.prepareStatement(sql1).executeUpdate();
            //此時製造錯誤
            //int i=1/0;

            String sql2="update account set money=money+100 where name='B'";
            connection.prepareStatement(sql2).executeUpdate();
            //提交事務
            connection.commit();//以上兩條sql都提交成功就會提交事務,否則進入catch語句執行回滾
            System.out.println("SUCCESS!!!!!!");
        } catch (Exception e) {
            try {
                //出現異常事務提交終止,回滾資料
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            //關閉連線釋放資源(一定要做)先開的後關
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

輸出結果

資料庫變化