怎么用数据库的悲观锁来实现一个分布式的锁
发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,这篇"怎么用数据库的悲观锁来实现一个分布式的锁"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看
千家信息网最后更新 2024年12月12日怎么用数据库的悲观锁来实现一个分布式的锁
这篇"怎么用数据库的悲观锁来实现一个分布式的锁"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"怎么用数据库的悲观锁来实现一个分布式的锁"文章吧。
分布式锁顾名思义是发生在分布式环境中的。对于单进程场景,我们可以使用语言和类库提供的锁,对于分布式锁,我也可以使用分布式锁。也就是说同样的锁使用的环境不同,分布式环境中用的锁就叫分布式锁!
根据上面的理解,分布式锁是不是应该具备下面的特点:
分布式锁必须保证在分布式部署的应用集群中,同一个方法在同一时间只能被一台机器上的一个线程执行;
一个线程获得了锁,其他线程必须等待持有锁的线程释放掉才能再获取;
锁必须要有超时机制(避免死锁)
基于上面的特点,我们就可以通过数据库的悲观锁来实现一个分布式锁。
代码非常的简单,使用 for update 即可。具体如下:
public class XttblogLock {
private DataSource dataSource;
private static final String cmd = "select * from xttblog_lock where id = 1 for update";
public XttblogLock(DataSource ds) {
this.dataSource = ds;
}
public static interface CallBack{
public void doAction();
}
public void lock(CallBack callBack) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
//try get lock
System.out.println(Thread.currentThread().getName() + " begin try lock");
conn = dataSource.getConnection();
conn.setAutoCommit(false);
stmt = conn.prepareStatement(cmd);
rs = stmt.executeQuery();
//do business thing
callBack.doAction();
//release lock
conn.commit();
System.out.println(Thread.currentThread().getName() + " release lock");
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
该锁的调用也非常的简单,具体代码如下:使用数据库悲观锁实现分布式锁主要用了数据库的 for update 命令,执行改命令后,对应行记录会被锁住,其它线程会被阻塞主,直到获取到这行记录的线程提交了事务。这里需要注意要把自动提交设置为 false。
该锁的调用也非常的简单,具体代码如下:
final XttblogLock xttblogLock = new XttblogLock(dataSource);
xttblogLock.lock(new CallBack() {
@Override
public void doAction() {
System.out.println(Thread.currentThread().getName() + "beging do somthing");
try {
System.out.println("业余草:www.xttblog.com 欢迎你!");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "end do somthing");
}
});
虽然数据库的 for update 悲观锁可以用来做分布式锁,但实际的生产过程中采用这种方法的非常少,因为它性能不是很高。
以上就是关于"怎么用数据库的悲观锁来实现一个分布式的锁"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
分布式
数据
数据库
悲观
线程
内容
代码
环境
面的
命令
文章
方法
特点
知识
篇文章
不同
顾名思义
中用
也就是
也就是说
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
计算机软件开发自考
数据库id值快满了怎么处理
信用信息基础数据库
软件开发项目组长职责
上海网络技术综合应用
宣汉软件开发
数据库接口方案
问卷星软件数据库模式设计
大一网络技术结课论文怎么写
植物常用数据库
服务器管理网口怎么配置
数据库统计优化
玩的游戏更新后找不到以前服务器
网络安全法意义及作用
计算机基础简述网络安全概念
dnf台服数据库备份
进入专家数据库有什么用
c 进行数据库单元测试
自己的网络连接阿里服务器
软件开发的培训学校
互联网之光博览会天玑科技
网络安全高科技
公司无盘服务器搭建
网络安全实验dos攻击
Linux基本网络技术
男友做软件开发创业
src全称网络安全
江西微信小程序软件开发
2022网络安全行业报告
网络安全行业出现故障怎么解决