java-JDBC事務

要麼一塊兒成功,要麼都失敗。java

package com.ibeidiao.utils;

import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Transaction {

    @Test
    public void transaction() throws SQLException {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {

            conn = JDBCUtils.getConn();
            conn.setAutoCommit(false); // 關閉事務自動提交
            String sql = "update account set money=money-? where id = ?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1, 100); //第一個參數
            ps.setInt(2, 1);  //第二個參數
            ps.executeUpdate();
            int a = 10/0;
//            rs = ps.executeQuery();
            ps.setInt(1, -100); //第一個參數
            ps.setInt(2, 2);  //第二個參數
            ps.executeUpdate();

            conn.commit();

        }catch (SQLException e){
            conn.rollback();
            e.printStackTrace();
        }finally {
            JDBCUtils.release(conn, ps,rs);
        }
    }
}

事務的安全隱患:程序員

  1. 若是不設置隔離級別,會引起髒讀:
    髒讀:一個事務讀到了另外一個事務還未提交到的數據
  2. 若是設置了隔離級別,能夠屏蔽掉髒讀,可是會形成數據庫的不可重複讀,兩次查詢的結果不同。(默認就是可重複讀).可是這樣仍是查不到數據庫真實的數據。

設置最高級別的隔離,就能夠把全部的問題所有屏蔽掉:Serializable(可串行化)sql

悲觀鎖:能夠再查詢的時候本身設置。數據庫

select * from account **for update** 認爲事務必定會出現問題,提早開啓鎖機制


樂觀鎖: 要求程序員本身控制。
安全

相關文章
相關標籤/搜索