数据库的两种锁类型:数据库
排它锁:数据被加上排它锁的时候,其余事务不能进行查询和修改并发
共享锁: 数据被加上共享锁的时候,其余事务能够查询可是不能修改性能
发生死锁的缘由:优化
一、事务之间对资源访问顺序的交替spa
假设有用户A和用户B,用户A访问了A表(锁住了A表)以后又去访问B表,这时用户B访问了B表(锁住了B表)以后又去访问A表。索引
这时候因为用户A访问B表已经被用户B锁住了,必须等待B释放锁。同时用户B要访问A表一样也被用户A锁住了,这时候就会发生互相等待,就发生了死锁。事务
解决方法:资源
调整程序逻辑顺序,尽可能按相同的顺序处理。io
二、并发先查询后修改同一记录程序
用户A去查询A表(会获取共享锁)这时候又去修改某一条数据就会企图升级为排它锁,这时候用户B也查询A表(一样也获取了共享锁)这时候用户B也去修改数据也会企图升级为排它锁,就会等待用户A释放共享锁,B一样在等待A释放共享锁
解决方法:
一、乐观锁
用version字段进行控制,查询出来的version版本若是和修改时候的version版本不一致的话就修改不成功,修改完成version版本+1
二、悲观锁
依靠数据库的锁机制实现,数据库性能的大量开销
三、全表扫描
若是执行了一个不知足条件的查询语句,由行级锁上升为表级锁,多个这样的事务执行后,就很容易产生死锁和阻塞。相似的状况还有当表中的数据量很是庞大而索引建的过少或不合适的时候,使得常常发生全表扫描,最终应用系统会愈来愈慢,最终发生阻塞或死锁。
解决方法:
SQL语句中不要使用太复杂的关联多表的查询;使用“执行计划”对SQL语句进行分析,对于有全表扫描的SQL语句,创建相应的索引进行优化。