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** 认为事务必定会出现问题,提早开启锁机制


乐观锁: 要求程序员本身控制。
安全

相关文章
相关标签/搜索