做IT的朋友们都知道甲方公司待遇好,福利好,都想进甲方,最近测试开发的同学们出去面试都会遇到这个问题,还是一个不错的甲方面试,想要进甲方,那么你的技术必须顶才行,如果只是会简单的功能测试线程死锁,就别做白日梦了,今天咱们就来解答下这个问题。

线程死锁的原因及解决方法_线程死锁的解决方法_线程死锁

死锁是指两个或多个事务在数据库中由于资源竞争而相互等待,导致所有事务都无法继续执行的情况。这种现象通常是由于不当的资源分配或操作顺序引起的。这话说的太过专业,相信很多小伙伴看完还是不明白什么意思,咱们就看下下面这张图:

线程死锁的原因及解决方法_线程死锁的解决方法_线程死锁

简单的说就是现在有两个线程,线程A和线程B,线程A现在已经占用了(锁住了)资源1,线程B已经占用了资源2,但是现在线程A想要完成当下的任务需要继续占用资源2,但是此时资源2已经被线程B占用着,同理线程B也是这个情况,于是两个线程在互相抢占各自需要的资源,你等待我释放资源1,我等你你释放资源2,进入一种互相等待的困境,这就是死锁的一种场景。

死锁的常见原因

资源争用:

事务未遵循固定的加锁顺序:

锁范围过大:

事务未及时释放锁:

具体实例场景:两个事务互相等待

假设有一个银行数据库,包含 表,事务 A 和事务 B 分别试图同时转账:

表结构:

CREATE TABLE Account (  AccountID INT PRIMARY KEY,  Balance DECIMAL(10, 2));

初始数据:

1000.00

1500.00

步骤导致死锁的过程:

事务 A 先锁住账户 1 的记录,然后尝试锁住账户 2:

BEGIN TRANSACTION;UPDATE Account SET Balance = Balance - 100 WHERE AccountID = 1;-- 事务 A 等待账户 2 的锁UPDATE Account SET Balance = Balance + 100 WHERE AccountID = 2;

事务 B 先锁住账户 2 的记录,然后尝试锁住账户 1:

BEGIN TRANSACTION;UPDATE Account SET Balance = Balance - 200 WHERE AccountID = 2;-- 事务 B 等待账户 1 的锁UPDATE Account SET Balance = Balance + 200 WHERE AccountID = 1;

此时:

由于互相等待,事务 A 和事务 B 都无法继续,导致死锁。

解决死锁的方法

避免循环等待:

减少锁的粒度:

使用事务超时机制:

优化事务逻辑:

死锁检测和回滚:

通过优化事务的设计与执行顺序,可以有效降低死锁的发生概率。

如果你也想进甲方,可以关注我们的公众号加我微信线程死锁,我这里有100家甲方企业的面试真题分享给你!

感觉写的还可以的话,点个《关注》和《在看》吧。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注