行级锁/悲观锁:某一行或多行被锁住,本事务中数据不能动,下一个事务只能排队等候上一个事务结束,再动数据。
//行级锁:在sql语句后面加for update
String sql=“select ename,job,sal from emp1 where job= ? for update”;
(1)行级锁程序
package com.jdbc;
import com.jdbc.utils.DBUtil;
import java.sql.*;
/**
* 这个程序开启一个事务,这个事务专门进行查询,并且使用行级锁/悲观锁,锁住相关记录。
* */
public class JDBCTest12 {
public static void main(String[] args) {
Connection conn =null;
PreparedStatement ps= null;
ResultSet rs =null;
try {//2.获取连接+1.注册驱动(类加载时调用)
conn= DBUtil.getConnection();
//开启事务
conn.setAutoCommit(false);
//行级锁
String sql="select ename,job,sal from emp1 where job= ? for update";
//3.获取预编译数据库操作对象
ps=conn.prepareStatement(sql);
ps.setString(1,"MANAGER");
//4.执行SQL语句
rs=ps.executeQuery();
//5.查询结果集
while (rs.next()){
System.out.println(rs.getString("ename")+","+rs.getString("job")+","+rs.getDouble("sal"));
}
//提交事务(事务结束)
conn.commit();
} catch (Exception e) {
if(conn!=null){
try {//回滚事务(事务结束)
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
}finally {
DBUtil.close(conn,ps,rs);
}
}
}/*结果:
JONES,MANAGER,2975.0
BLAKE,MANAGER,2850.0
CLARK,MANAGER,2450.0
JONES,MANAGER,2975.0
BLAKE,MANAGER,2850.0
CLARK,MANAGER,2450.0*/
(2)这个程序负责修改被锁定的记录 JDBCTest12 行级锁
package com.jdbc;
import com.jdbc.utils.DBUtil;
import java.sql.*;
/**
* 这个程序负责修改被锁定的记录 JDBCTest12 行级锁
* */
public class JDBCTest13 {
public static void main(String[] args) {
Connection conn= null;
PreparedStatement ps =null;
try {
conn= DBUtil.getConnection();
conn.setAutoCommit(false);
String sql="update emp1 set sal =sal * 1.1 where job =?";
ps=conn.prepareStatement(sql);
ps.setString(1,"MANAGER");
int count = ps.executeUpdate();
System.out.println(count);// 3 3条job=MANAGER记录
conn.commit();
} catch (Exception e) {
if(conn!=null){
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
}finally {
DBUtil.close(conn,ps,null);
}
}
}
结果:
update emp1 set sal =sal * 1.1 where job =?