悲观锁与乐观锁
行级锁(又被称为悲观锁)
select语句,如果在后面加一个for update;就会将查询到的结果及其所在行锁住,其他的事务无法对其进行修改操作
乐观锁
多线程并发,都可以对记录进行修改,只不过在这条记录上他有一个版本号
演示行级锁机制
package utsc.java.jdbc.DBUtil;
import utsc.java.jdbc.DBUtil.utils.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 = ? 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 (SQLException 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
package utsc.java.jdbc.DBUtil;
import utsc.java.jdbc.DBUtil.utils.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCTest14 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DBUtil.getConnection();
conn.setAutoCommit(false);
String sql = "update emp set 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 (SQLException e) {
if (conn !=null){
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
}finally {
DBUtil.close(conn,ps,null);
}
}
}
3
打断点演示