悲观锁(行级锁 for update)和乐观锁机制
悲观锁案例:
package com.java.JDBC; import util.DBUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 这个程序开启一个事务,这个四五专门进行查询,并且使用行级锁/悲观锁,锁住相关的记录。 */ public class JDBCTest13 { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 获取连接 conn = DBUtil.getConnection(); // 开启事务 conn.setAutoCommit(false); // 获取数据库对象 String sql = "select ename,job,sal from emp where job = ?"; ps = conn.prepareStatement(sql); ps.setString(1,"MANAGER"); rs = ps.executeQuery(); while (rs.next()){ String ename = rs.getString("ename"); String job = rs.getString("job"); Double sal = rs.getDouble("sal"); System.out.println(ename + " " + job + " " + sal); } // 提交事务 conn.commit(); } catch (SQLException e) { if (conn != null){ try { // 回滚事务(事务结束) conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } e.printStackTrace(); } finally { // 释放资源 DBUtil.close(conn,ps,rs); } } }
package com.java.JDBC; import util.DBUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 这个程序负责修改被锁定的记录 */ public class JDBCTest14 { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 获取连接 conn = DBUtil.getConnection(); // 开启事务 conn.setAutoCommit(false); String sql = "update emp set sal = sal * 1.1 where job = ? for update"; ps = conn.prepareStatement(sql); ps.setString(1,"MANAGER"); int count = ps.executeUpdate(); System.out.println(count); // 提交事务 conn.commit(); } catch (SQLException e) { if (conn != null) { try { // 回滚事务 conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } e.printStackTrace(); } finally { // 释放资源 DBUtil.close(conn,ps,null); } } }