经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MySQL » 查看文章
【JDBC】笔记(5)--- 悲观锁和乐观锁的概念;演示行级锁机制
来源:cnblogs  作者:猿头猿脑的王狗蛋  时间:2022/1/3 14:59:15  对本文有异议

1.悲观锁和乐观锁的概念:


2.演示行级锁机制:

注意:DBUtil类 为博主之前自己写的类:【JDBC】编程(2)--- 写一个JDBC工具类;用 JDBC工具类 实现模糊查询

 

/*

演示行级锁机制

此程序先开启事务,并使用行级锁锁住“loginName = abc”的那条记录

*/

 

  1. import java.sql.*;
  2. public class JDBCLock01 {
  3. public static void main(String[] args) {
  4. Connection connection = null;
  5. PreparedStatement ps = null;
  6. ResultSet resultSet = null;
  7. try {
  8. connection = DBUtil.getConnection();
  9. connection.setAutoCommit(false);
  10. //锁住“loginName = abc”的这条记录
  11. String sql = "select loginName,loginPwd from t_user where loginName = ? for update";
  12. ps = connection.prepareStatement(sql);
  13. ps.setString(1,"abc");
  14. resultSet = ps.executeQuery();
  15. while (resultSet.next()){
  16. System.out.println("loginName = "+resultSet.getString("loginName")+
  17. ",loginPwd = "+resultSet.getString("loginPwd"));
  18. }
  19. //添加断点,让此事务在此暂停10s后结束
  20. Thread.sleep(10000);//使当前线程暂停10000毫秒
  21. connection.commit();
  22. } catch (Exception e) {
  23. if (connection != null) {
  24. try {
  25. connection.commit();
  26. } catch (SQLException ex) {
  27. ex.printStackTrace();
  28. }
  29. }
  30. e.printStackTrace();
  31. }finally {
  32. DBUtil.close(connection,ps,resultSet);
  33. }
  34. }
  35. }

 

"JDBCLock01"控制台情况:

(暂停大约1000毫秒然后输出:)

  1. loginName = abc,loginPwd = 123
  2. Process finished with exit code 0

 


/*

演示行级锁机制

此程序后开启事务,负责修改被锁定的记录

*/

 

  1. import java.sql.*;
  2. public class JDBCLock02 {
  3. public static void main(String[] args) {
  4. Connection connection = null;
  5. PreparedStatement ps = null;
  6. try {
  7. connection = DBUtil.getConnection();
  8. connection.setAutoCommit(false);
  9. //修改“loginName = abc”的这条记录的密码
  10. String sql = "update t_user set loginPwd = ? where loginName = ?";
  11. ps = connection.prepareStatement(sql);
  12. ps.setString(1,"888");
  13. ps.setString(2,"abc");
  14. int count = ps.executeUpdate();
  15. System.out.println("更新数据"+count+"条");
  16. connection.commit();
  17. } catch (SQLException e) {
  18. if (connection != null) {
  19. try {
  20. connection.commit();
  21. } catch (SQLException ex) {
  22. ex.printStackTrace();
  23. }
  24. }
  25. e.printStackTrace();
  26. }finally {
  27. DBUtil.close(connection,ps,null);
  28. }
  29. }
  30. }

 

"JDBCLock02"控制台输出结果:

("JDBCLock01"程序结束后输出)

  1. 更新数据1
  2. Process finished with exit code 0

 

总结:在当前事务中,用行级锁锁住的记录,那么在此事务结束之前,其他事务将无法对“锁住的记录”进行操作(update/delete),但是select可以。

 

原文链接:http://www.cnblogs.com/Burning-youth/p/15759459.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号