数据库锁的几种原因和解决办法

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

数据库的两种锁类型:

    排它锁:数据被加上排它锁的时候,其他事务不能进行查询和修改

    共享锁: 数据被加上共享锁的时候,其他事务可以查询但是不能修改

发生死锁的原因:

    1、事务之间对资源访问顺序的交替

假设有用户A和用户B,用户A访问了A表(锁住了A表)之后又去访问B表,这时用户B访问了B表(锁住了B表)之后又去访问A表。

这时候由于用户A访问B表已经被用户B锁住了,必须等待B释放锁。同时用户B要访问A表同样也被用户A锁住了,这时候就会发生互相等待,就发生了死锁。

解决方法:

调整程序逻辑顺序,尽量按相同的顺序处理。

    2、并发先查询后修改同一记录

用户A去查询A表(会获取共享锁)这时候又去修改某一条数据就会企图升级为排它锁,这时候用户B也查询A表(同样也获取了共享锁)这时候用户B也去修改数据也会企图升级为排它锁,就会等待用户A释放共享锁,B同样在等待A释放共享锁

解决方法:

1、乐观锁

    用version字段进行控制,查询出来的version版本如果和修改时候的version版本不一致的话就修改不成功,修改完成version版本+1

2、悲观锁

    依靠数据库的锁机制实现,数据库性能的大量开销

    3、全表扫描

如果执行了一个不满足条件的查询语句,由行级锁上升为表级锁,多个这样的事务执行后,就很容易产生死锁和阻塞。类似的情况还有当表中的数据量非常庞大而索引建的过少或不合适的时候,使得经常发生全表扫描,最终应用系统会越来越慢,最终发生阻塞或死锁。

解决方法:

SQL语句中不要使用太复杂的关联多表的查询;使用“执行计划”对SQL语句进行分析,对于有全表扫描的SQL语句,建立相应的索引进行优化。

转载于:https://my.oschina.net/u/1175305/blog/1798468

你可能感兴趣的:(数据库锁的几种原因和解决办法)