MySQL的悲观锁
- 今天有学习到悲观锁和乐观锁,虽然乐观锁理解了概念,但是实操用到了悲观锁。
悲观锁实操
- 悲观锁主要文件
package com.javase.JDBCLearn;
import com.javase.JDBCUtil.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PessimisticLock {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtil.connectionJDBC(); // 自己封装了一个JDBC工具类
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.getString("sal"));
}
conn.commit();
} catch (SQLException e) {
try {
conn.rollback(); // 回滚
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
}
- 测试文件
package com.javase.JDBCLearn;
import com.javase.JDBCUtil.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PessimisticLock2 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtil.connectionJDBC();// 同样也是封装的JDBC工具类
String sql = "update emp set sal = sal + 100 where job = ?";
ps = conn.prepareStatement(sql);
ps.setString(1, "MANAGER");
int res = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 先debug在悲观锁主要文件上的
commit
提交事务上
- 断点停在
commit
提交事务上,我们再运行测试文件
,一直处于等待状态
- 放开
断点
,测试文件
立即执行,所以悲观错不允许并发执行,只能排队执行