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

通过debug模式进行演示

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

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

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

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

Test1

package com.examples.jdbc.o12_悲观锁;

import com.examples.jdbc.utils.DBUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; /**
* 简单的行级锁的演示
*/
public class Test1 {
public static void main(String[] args) {
//3个数据库资源对象
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
//jdbc数据库操作 try {
//1.
connection = DBUtils.getConnection();
connection.setAutoCommit(false); //2.
String sql = "select * from tb_user where uname like ? for update";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "_"); //3.
resultSet = preparedStatement.executeQuery();
while(resultSet.next()){
int id = resultSet.getInt("id");
String uname = resultSet.getString("uname");
String upasswd = resultSet.getString("upasswd");
System.out.println("id: " + id + " uname: " + uname + " upasswd: " + upasswd);
}
connection.commit(); } catch (SQLException e) {
if(connection != null){
try {
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
}finally {
//4.
DBUtils.close(connection, preparedStatement, resultSet);
}
}
}

Test2

package com.examples.jdbc.o12_悲观锁;

import com.examples.jdbc.utils.DBUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException; /**
* 模拟在行级锁起作用期间,修改被锁定的数据
*/
public class Test2 {
public static void main(String[] args) {
//2个jdbc资源对象
Connection connection = null;
PreparedStatement preparedStatement = null; //jdbc操作 try {
//1.
connection = DBUtils.getConnection();
connection.setAutoCommit(false); //2.
String sql = "update tb_user set upasswd = ? where uname like ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "xun");
preparedStatement.setString(2, "_"); //3.
int num = preparedStatement.executeUpdate();
System.out.println(num == 1 ? "修改成功" : "修改失败"); connection.commit(); } catch (SQLException e) {
if(connection != null){
try {
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
}finally {
//4.
DBUtils.close(connection, preparedStatement, null);
}
}
}

最新文章

  1. 在同一台电脑上同时安装Python2和Python3
  2. Pig + Ansj 统计中文文本词频
  3. MVC认知路【点点滴滴支离破碎】【三】----IIS7.5上部署MVC4.0
  4. FrameSize、WinSize、VisibleSize、VisibleOrigin区别
  5. Python安装BeautifulSoup库(Windows平台下)
  6. 无线Ad-hoc网络的关键技术之路由(转)
  7. OpenStack G版以后的Availability Zone与Aggregate Hosts
  8. ubuntu16.04 python3 安装selenium及环境配置
  9. mac book pro macOS10.13.3安装qt、qt creator C++开发环境,qt5.11.1,并解决cmake构建:qt mac this file is not part of any project the code
  10. NoteBook学习(一)-------- Zeppelin VS Jupyter
  11. 部署wp 的时候遭遇的google字体问题
  12. 【转】采用dlopen、dlsym、dlclose加载动态链接库
  13. Flask学习笔记(3)--路由
  14. 使用Python登录Github网站
  15. Xshell设置网络设备自动登录
  16. _编程语言_C_C++_数据结构_struct
  17. 1.网站应用程序 - 《APS.NET本质论》
  18. C语言 · 瓷砖铺放
  19. python中获取当前路径并添加到系统路径
  20. 使用perldoc阅读perl文档

热门文章

  1. Docker容器网络-基础篇
  2. vuepress搭建UI组件库文档踩坑篇
  3. vue实例vm的方法
  4. Idea之常用插件
  5. 1.Docker简介
  6. Event Loop 是什么?
  7. django小项目,使用paramiko自动备份网络设备配置
  8. 设计并实现加法器类 Adder
  9. bind-utils-测试域名解析
  10. HtmlParse:一款超轻量级的HTML文件解析和爬取工具