数据进行并发控制的2种基本锁
-共享锁:当数据对象被加上共享锁,可以读取,不能修改修改
-排他锁:当数据对象被加上排他锁,其他事务不能对它进行读取和修改
常见死锁情况
事务之间对资源访问顺序的交替
出现原因:A访问表a锁住了表a,然后又访问了b。B访问b锁住了b,企图访问表a。A和B都等待对方释放表。
解决办法:常见,由于程序BUG导致。需要调整程序逻辑。
并发修改同一记录
出现原因:A查询1条记录,修改该条记录。这时B也查询并要修改该条记录。A的共享锁企图上升为排他锁,而这时B由于A的共享锁存在,等待A释放。而A由于B的共享锁存在而无法上升到排他锁,故不能释放共享锁。
解决办法:隐蔽,大型项目经常发生,使用乐观锁或者使用悲观锁进行控制,或sqlsever的更新锁。
索引不当导致全表扫描
出现原因:事务中执行了一个不满足条件的语句,执行全表扫描,行级锁上升为表级锁,多个事务这样执行后容易导致死锁,或当表中的数据量非常庞大,而索引建的过少或不合适的时候,使得经常进行全表扫描,使得应用系统越来越慢,最总阻塞或死锁。
解决办法:SQL不要太复杂,对有全表扫描的sql建立索引或优化。