怎么用数据库的悲观锁来实现一个分布式的锁
发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,这篇"怎么用数据库的悲观锁来实现一个分布式的锁"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看
千家信息网最后更新 2025年01月24日怎么用数据库的悲观锁来实现一个分布式的锁
这篇"怎么用数据库的悲观锁来实现一个分布式的锁"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"怎么用数据库的悲观锁来实现一个分布式的锁"文章吧。
分布式锁顾名思义是发生在分布式环境中的。对于单进程场景,我们可以使用语言和类库提供的锁,对于分布式锁,我也可以使用分布式锁。也就是说同样的锁使用的环境不同,分布式环境中用的锁就叫分布式锁!
根据上面的理解,分布式锁是不是应该具备下面的特点:
分布式锁必须保证在分布式部署的应用集群中,同一个方法在同一时间只能被一台机器上的一个线程执行;
一个线程获得了锁,其他线程必须等待持有锁的线程释放掉才能再获取;
锁必须要有超时机制(避免死锁)
基于上面的特点,我们就可以通过数据库的悲观锁来实现一个分布式锁。
代码非常的简单,使用 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安全错误
数据库的锁怎样保障安全
数据库技术考级难吗
联通网络安全系统
卫生部仪器设备软件开发小组
网络安全公司主要干啥
尚云客网络技术招聘
长沙国家网络安全产业前景
雀魂服务器没信号
嵌入式软件开发业余兼职
网络安全管理讲座开场白
杭州市爱赞网络技术有限公司
在线网络技术开发项目
连接谷歌服务器出现问题怎么解决
杭州拓娱网络技术有限公司
数据库能分块存储么
服务器系统管理员账号
战地1在哪个服务器比较稳定
珠海网欣软件开发怎么样
软件开发常用控件
远程管理数据库
特色软件开发服务电话
普陀区辅助网络技术推荐咨询
基岩版1.18生存服务器ip
深圳市辰星软件开发
结合疫情防控谈谈网络安全
袋鼠路由刷op做服务器
理解数据库安全技术
国土三调数据库2022年启用
服务器电脑重装系装
网络安全跟有线无线有关吗
最新网络安全问题有哪些