JDBC的复习(六):JDBC的悲观锁和乐观锁
悲观锁和乐观锁
select ename,job,sal from emp where job = 'MANAGER' for update;
如果在select语句中的最后加上for update,那么在这个事务还没有结束的时候,查找出来的数据对应数据库的记录不能被修改!!!
也就是这三条:
- 注意:
演示
package com.bjpowernode.jdb;
import com.bjpowernode.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 这个程序开启一个事务,这个事务专门进行查询,并且使用悲观锁,锁住相关记录
* @author 31200
*/
public class JdbcTest12 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//获取连接
conn = JdbcUtils.getConnection();
//开启事务
conn.setAutoCommit(false);
//获取数据库操作对象
String sql = "select ename,job,sal from emp where job = ? for update ";
ps = conn.prepareStatement(sql);
ps.setString(1,"MANAGER");
rs = ps.executeQuery();
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 throwables) {
throwables.printStackTrace();
}
}
e.printStackTrace();
}finally {
//释放资源
JdbcUtils.release(conn,ps,rs);
}
}
}
package com.bjpowernode.jdb;
import com.bjpowernode.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* 这个程序负责修改被锁定的记录
* @author 31200
*/
public class JdbcTest13 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
//获取连接
conn = JdbcUtils.getConnection();
//开启事务
conn.setAutoCommit(false);
//获取数据库操作对象
String sql = "update emp sqt sal = sal * 1.1 where job = ?";
ps = conn.prepareStatement(sql);
ps.setString(1,"MANAGER");
int count = ps.executeUpdate();
System.out.println(count);
conn.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.release(conn,ps,null);
}
}
}