For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
死锁是程序员在做数据库运维管理的时候经常会遇到的一个问题,下面我们就通过案例分析来了解一下,数据库死锁产生场景与预防方法。
死锁:两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环。
导致死锁的场景:
间隙锁导致的死锁:比如两个事务A,B,都锁了(3,8)之间的范围,事务A进行插入数据到(3,8)发生阻塞,同理事务B进行插入数据到(3,8)也发生阻塞。但是它俩都僵持着,互相进行阻塞,就发生死锁
页锁导致的死锁:事务A,B。A先锁住页1然后锁了页2,B先锁了页2然后锁了页1。
出现死锁,有2种策略
方式一:直接进入等待,直到超时。这个超时时间可以通过innodb_lock_wait_timeout来设置。
方式二:死锁检测,发现死锁,主动回滚死锁链中的某一个事务,让其他事务继续执行。通过innodb_deadlock_detect设置为on来开启。
如何避免出现死锁:(了解)
如果不同的程序并发存取多个表,尽量以相同的顺序访问表。
在程序以批量方式处理数据的时候,如果已经对数据排序,尽量保证每个线程按照固定的顺序来处理记录。
在事务中,如果需要更新记录,应直接申请足够级别的排他锁,而不应该先申请共享锁,更新时在申请排他锁,因为在当前用户申请排他锁时,其他事务可能已经获得了相同记录的共享锁,从而造成锁冲突或者死锁。
尽量使用较低的隔离级别。
尽量使用索引访问数据,使加锁更加准确,从而减少锁冲突的机会。
合理选择事务的大小,小事务发生锁冲突的概率更低。
尽量用相等的条件访问数据,可以避免Next-Key锁对并发插入的影响。
不要申请超过实际需要的锁级别,查询时尽量不要显示加锁。
对于一些特定的事务,可以表锁来提高处理速度或减少死锁的概率。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。