gpt4 book ai didi

java - 解决僵局的策略?

转载 作者:太空宇宙 更新时间:2023-11-04 14:22:42 24 4
gpt4 key购买 nike

我在生产中遇到了数据库死锁。经过分析,我发现两个线程以相反的顺序获取了锁。例如:-

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

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

因此发生了死锁。

幸运的是,我能够在线程 2 下通过以与线程 1 相同的顺序获取锁来解决这个问题,即现在两个线程都尝试获取锁先对表1加锁,再对表2加锁,死锁解决了。

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

我能想到的另一种方法是

1) Pessimistic Locking where to acquire lock in advance on required resorces

2) keeping the reentrant lock in cache before starting operation in thread 1 and thread 2 can't proceed till first thread release the lock. But i am not convinced with this approach as it will fill the application with this kind of code. Also developer can forget to release lock.

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

最佳答案

您可以在数据库中创建表(locktable),并将锁定记录的主键存储在该表中。
在更新主表之前尝试在锁定表中查找记录。
如果没有找到记录,您将在锁表中创建并选择更新记录。
其他线程和应用程序在更新主表之前检查锁表中的记录。
这种方式的好处 - 您的应用程序不会锁定主表中的数据,其他进程可以从主表中选择数据。

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

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

关于java - 解决僵局的策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27013496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com