jdbc连接mysql,简单演示行级锁

通过debug模式进行演示

在Test1程序设置断点,让程序1,查询并锁定数据,且程序不执行完(此时停在debug断点处)

这时启动Test2程序,去修改已经被锁定的数据,发现此时,程序2出现等待情况

让程序1的断点结束,此时程序2可以顺利修改数据

原因: 程序1的行级锁已经释放

Test1

  1. package com.examples.jdbc.o12_悲观锁;
  2. import com.examples.jdbc.utils.DBUtils;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. /**
  8. * 简单的行级锁的演示
  9. */
  10. public class Test1 {
  11. public static void main(String[] args) {
  12. //3个数据库资源对象
  13. Connection connection = null;
  14. PreparedStatement preparedStatement = null;
  15. ResultSet resultSet = null;
  16. //jdbc数据库操作
  17. try {
  18. //1.
  19. connection = DBUtils.getConnection();
  20. connection.setAutoCommit(false);
  21. //2.
  22. String sql = "select * from tb_user where uname like ? for update";
  23. preparedStatement = connection.prepareStatement(sql);
  24. preparedStatement.setString(1, "_");
  25. //3.
  26. resultSet = preparedStatement.executeQuery();
  27. while(resultSet.next()){
  28. int id = resultSet.getInt("id");
  29. String uname = resultSet.getString("uname");
  30. String upasswd = resultSet.getString("upasswd");
  31. System.out.println("id: " + id + " uname: " + uname + " upasswd: " + upasswd);
  32. }
  33. connection.commit();
  34. } catch (SQLException e) {
  35. if(connection != null){
  36. try {
  37. connection.rollback();
  38. } catch (SQLException ex) {
  39. ex.printStackTrace();
  40. }
  41. }
  42. e.printStackTrace();
  43. }finally {
  44. //4.
  45. DBUtils.close(connection, preparedStatement, resultSet);
  46. }
  47. }
  48. }

Test2

  1. package com.examples.jdbc.o12_悲观锁;
  2. import com.examples.jdbc.utils.DBUtils;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.SQLException;
  6. /**
  7. * 模拟在行级锁起作用期间,修改被锁定的数据
  8. */
  9. public class Test2 {
  10. public static void main(String[] args) {
  11. //2个jdbc资源对象
  12. Connection connection = null;
  13. PreparedStatement preparedStatement = null;
  14. //jdbc操作
  15. try {
  16. //1.
  17. connection = DBUtils.getConnection();
  18. connection.setAutoCommit(false);
  19. //2.
  20. String sql = "update tb_user set upasswd = ? where uname like ?";
  21. preparedStatement = connection.prepareStatement(sql);
  22. preparedStatement.setString(1, "xun");
  23. preparedStatement.setString(2, "_");
  24. //3.
  25. int num = preparedStatement.executeUpdate();
  26. System.out.println(num == 1 ? "修改成功" : "修改失败");
  27. connection.commit();
  28. } catch (SQLException e) {
  29. if(connection != null){
  30. try {
  31. connection.rollback();
  32. } catch (SQLException ex) {
  33. ex.printStackTrace();
  34. }
  35. }
  36. e.printStackTrace();
  37. }finally {
  38. //4.
  39. DBUtils.close(connection, preparedStatement, null);
  40. }
  41. }
  42. }

jdbc 12: 悲观锁的更多相关文章

  1. java:Hibernate框架4(延迟加载(lazy),抓取(fetch),一级缓存,get,load,list,iterate,clear,evict,flush,二级缓存,注解,乐观锁和悲观锁,两者的比较)

    1.延时加载和抓取: hibernate.cfg.xml: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-co ...

  2. sql server对并发的处理-乐观锁和悲观锁【粘】

    假如两个线程同时修改数据库同一条记录,就会导致后一条记录覆盖前一条,从而引发一些问题. 例如: 一个售票系统有一个余票数,客户端每调用一次出票方法,余票数就减一. 情景: 总共300张票,假设两个售票 ...

  3. mysql的锁--行锁,表锁,乐观锁,悲观锁

    一 引言--为什么mysql提供了锁 最近看到了mysql有行锁和表锁两个概念,越想越疑惑.为什么mysql要提供锁机制,而且这种机制不是一个摆设,还有很多人在用.在现代数据库里几乎有事务机制,aci ...

  4. Hibernate乐观锁和悲观锁

    Hibernate支持两种锁机制: 即通常所说的"悲观锁(Pessimistic Locking)"和 "乐观锁(OptimisticLocking)". 悲观 ...

  5. SQL Server 锁机制 悲观锁 乐观锁 实测解析

    先引入一些概念,直接Copy其他Blogs中的,我就不单独写了. 一.为什么会有锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 1.丢失更新 A,B两个用户读同一数据并进行修改,其中 ...

  6. Mysql锁机制--乐观锁 & 悲观锁

    Mysql 系列文章主页 =============== 从 这篇 文章中,我们知道 Mysql 并发事务会引起更新丢失问题,解决办法是锁.所以本文将对锁(乐观锁.悲观锁)进行分析. 第一部分 悲观锁 ...

  7. sql server对并发的处理-乐观锁和悲观锁

    https://www.cnblogs.com/dengshaojun/p/3955826.html sql server对并发的处理-乐观锁和悲观锁 假如两个线程同时修改数据库同一条记录,就会导致后 ...

  8. 多线程深入:乐观锁与悲观锁以及乐观锁的一种实现方式-CAS(转)

    原文:https://www.cnblogs.com/qjjazry/p/6581568.html 首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每 ...

  9. C# 乐观锁、悲观锁、共享锁、排它锁、互斥锁

    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据 ...

随机推荐

  1. 实现Linux系统的回收站

    Linux系统默认没有回收站功能,使用rm命令进行删除操作,文件就会直接从系统中删除,很难恢复. 今天我们利用简单的shell脚本实现Linux系统下的回收站机制. 先提供脚本代码 [root@qll ...

  2. 【hexo博客搭建】本地搭建hexo博客(上)

    前言 本篇文章会从本地(Windows 10)搭建-主题更换-部署阿里云详细步骤,如果在搭建过程中,遇到问题,可以通过博客页脚下的QQ联系我,或者在下面评论留言 一.本地搭建 1.安装前置 1.1安装 ...

  3. zabbix5.0报错PHP时区未设置(配置参数"date.timezone")

    解决办法 : #1.编辑文件/etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf,取消注释并设置为所在地时区 vim /etc/opt/rh/rh-php72/php- ...

  4. linux篇-linux下zabbix安装

    1本人用的是apache+mysql+php 2下载zabbix软件包,官网下载 https://sourceforge.net/projects/zabbix/files/ZABBIX Latest ...

  5. python基础学习5

    Python的基础学习5 内容概要 流程控制理论 if判断 while循环 内容详情 流程控制理论 # 流程控制:即控制事物执行的流程 # 执行流程的分类 1.顺序结构 从上往下按顺序依次执行 2.分 ...

  6. ExtJS 布局-Border 布局(Border layout)

    更新记录: 2022年6月11日 发布. 2022年6月1日 开始. 1.说明 边框布局允许根据区域(如中心.北部.南部.西部和东部)指定子部件的位置.还可以调整子组件的大小和折叠. 2.设置布局方法 ...

  7. ExtJS 同行表单域对齐有误处理办法

    更新记录 2022年5月29日 第一次编辑.使用的ExtJS版本:ExtJS 7.4 问题 原本都是显示正常的表单域,比如这些文本框.选择框都是正常. 在用户进行操作,然后显示验证提示后,明显出现了问 ...

  8. 如何从0开发一个Vue组件库并发布到npm

    1.新建文件夹在终端打开执行 npm init -y 生成package.json如下,注意如果要发布到npm,name不能有下划线,大写字母等 { "name": "v ...

  9. BUUCTF-LSB

    LSB 看到这个题目应该是LSB隐写,StegSolve打开,在红绿蓝0号上发现图片信息 然后在Analyse选择data extract Save bin保存图片即可 得到的是个二维码,解码即可.

  10. JavaScript易错知识点

    JavaScript易错知识点整理1.变量作用域上方的函数作用域中声明并赋值了a,且在console之上,所以遵循就近原则输出a等于2. 上方的函数作用域中虽然声明并赋值了a,但位于console之下 ...