要麼一塊兒成功,要麼都失敗。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** 認爲事務必定會出現問題,提早開啓鎖機制
樂觀鎖: 要求程序員本身控制。
安全