要么一块儿成功,要么都失败。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); } } }
事务的安全隐患:程序员
设置最高级别的隔离,就能够把全部的问题所有屏蔽掉:Serializable(可串行化)sql
悲观锁:能够再查询的时候本身设置。数据库
select * from account **for update** 认为事务必定会出现问题,提早开启锁机制
乐观锁: 要求程序员本身控制。
安全