做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家甲方企业的面试真题分享给你!
感觉写的还可以的话,点个《关注》和《在看》吧。