我在生产过程中遇到了数据库死锁。在分析时,我发现锁是由两个线程按相反顺序排列的。例如:-
1)Thread 1 :-首先在表1行上获得独占行锁,然后尝试获取表2行上的共享行锁。
2)Thread 2:-首先在表2行上获得独占行锁,然后尝试获取表1行上的共享行锁。
于是死锁就发生了。
幸运的是,我能够在线程2下解决它,方法是按照与线程1相同的顺序获得锁,也就是说,现在这两个线程都试图先在表1上获取锁,然后在表2上获得锁。
我在这里很幸运,这里有可能改变锁的顺序,因为它涉及到微小的变化。但我确信,在某些情况下,这是不可能的,要么是因为业务功能,要么是可能需要对应用程序进行重大更改。因此,我可以考虑解决这类死锁的另外两种方法(无论是数据库锁还是java锁)。他们是:-
我能想到的另一种方法是
1)悲观锁定 ( 2)在线程1和线程2中启动操作之前,将重入锁保存在缓存中,直到第一个线程释放锁才能继续执行。但是我不相信这种方法,因为它会用这种代码填充应用程序。此外,开发人员可以忘记释放锁。
因此,我想知道解决死锁的其他替代方法是什么。有什么想法吗?
发布于 2014-11-19 09:59:38
您可以在数据库中创建表(可锁定表),并在此表中存储锁定记录的主键。
在更新主表之前,请尝试在锁表中查找记录。
如果没有找到记录,您将创建并选择可锁定的更新记录。
其他线程和应用程序在更新主表之前检查可锁记录。
这种方式的好处是,您的应用程序不会锁定主表中的数据,其他进程也可以从主表中选择数据。
如何确保对此表的可序列化访问?
所有应用程序插入锁定记录和锁定悲观(选择更新)这些记录。
https://stackoverflow.com/questions/27013496
复制相似问题