首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接近死锁的策略?

接近死锁的策略?
EN

Stack Overflow用户
提问于 2014-11-19 09:42:26
回答 1查看 114关注 0票数 1

我在生产过程中遇到了数据库死锁。在分析时,我发现锁是由两个线程按相反顺序排列的。例如:-

1)Thread 1 :-首先在表1行上获得独占行锁,然后尝试获取表2行上的共享行锁。

2)Thread 2:-首先在表2行上获得独占行锁,然后尝试获取表1行上的共享行锁。

于是死锁就发生了。

幸运的是,我能够在线程2下解决它,方法是按照与线程1相同的顺序获得锁,也就是说,现在这两个线程都试图先在表1上获取锁,然后在表2上获得锁。

我在这里很幸运,这里有可能改变锁的顺序,因为它涉及到微小的变化。但我确信,在某些情况下,这是不可能的,要么是因为业务功能,要么是可能需要对应用程序进行重大更改。因此,我可以考虑解决这类死锁的另外两种方法(无论是数据库锁还是java锁)。他们是:-

我能想到的另一种方法是

1)悲观锁定 ( 2)在线程1和线程2中启动操作之前,将重入锁保存在缓存中,直到第一个线程释放锁才能继续执行。但是我不相信这种方法,因为它会用这种代码填充应用程序。此外,开发人员可以忘记释放锁。

因此,我想知道解决死锁的其他替代方法是什么。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2014-11-19 09:59:38

您可以在数据库中创建表(可锁定表),并在此表中存储锁定记录的主键。

在更新主表之前,请尝试在锁表中查找记录。

如果没有找到记录,您将创建并选择可锁定的更新记录。

其他线程和应用程序在更新主表之前检查可锁记录。

这种方式的好处是,您的应用程序不会锁定主表中的数据,其他进程也可以从主表中选择数据。

如何确保对此表的可序列化访问?

所有应用程序插入锁定记录和锁定悲观(选择更新)这些记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27013496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档