mysql数据库行级锁的使用(二)
2024-10-15 06:30:46
项目上的另外一个需求是:
在做统计的时候需要将当前表锁定不能更新当前表记录
直接上代码
package com.robert.RedisTest; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;
import java.util.concurrent.TimeUnit; public class JDBCCountLockTest { private static String jdbcUrl = "jdbc:mysql://localhost:3306/test";
private static String username = "test";
private static String password = "test"; public static void main(String[] args) { new Thread(new Runnable(){
public void run(){
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(jdbcUrl,username,password);
connection.setAutoCommit(false);
Statement st = connection.createStatement();
st.executeQuery("select count(1) num from table_name where mobile_phone = '13651969037' and rule_id='39' for update");
TimeUnit.SECONDS.sleep(5);
connection.commit();
System.out.println("Thread 1 commit "+Calendar.getInstance().getTime());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start(); new Thread(new Runnable(){
public void run(){
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(jdbcUrl,username,password);
connection.setAutoCommit(false);
Statement st = connection.createStatement();
TimeUnit.SECONDS.sleep(1);
st.executeQuery("select * from table_name where id=4139 for update");
System.out.println("Thread 2 executeQuery finish "+Calendar.getInstance().getTime());
String update_sql_1 = "update table_name set rule_id='40' where id = '4139'";
st.executeUpdate(update_sql_1);
System.out.println("Thread 2 executeUpdate finish "+Calendar.getInstance().getTime());
connection.commit();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
在Thread 2中 先sleep 1s
保证了Thread 1先执行
然后在Thread 1执行结束之后,Thread 2才能执行更新操作。
执行结果如下:
Thread 1 commit Thu Sep 01 15:58:51 CST 2016
Thread 2 executeQuery finish Thu Sep 01 15:58:51 CST 2016
Thread 2 executeUpdate finish Thu Sep 01 15:58:51 CST 2016
最新文章
- cocos2dx &;&; Lua 环境配置
- MySql避免重复插入记录
- 通过rinetd实现端口转发来访问内网的服务
- HashMap循环遍历方式及其性能对比(zhuan)
- php以excel的形式将数据输出
- NLog 传递参数
- eclipse 修改设置Ctrl+Shift+F长度
- PHP构造函数的用法分析
- android开发之Toast的多种应用
- SqlSugar框架T4模板的使用
- HDU 1599 find the mincost route (无向图floyd最小环详解)
- C#发送邮件类
- Python之文件与目录操作及压缩模块(os、shutil、zipfile、tarfile)
- 虚拟机console基础环境部署——系统基础环境
- 从零开始学习PYTHON3讲义(一)认识Python
- Java集合类源码解析:ArrayList
- Java异常处理——受控(checked)的异常(throws语句)
- Matplotlib学习---用wordcloud画词云(Word Cloud)
- [转]golang的goroutine调度机制
- linux系统中对SSD硬盘优化的方法