前几天刚遇到这么一个情况,在调试程序过程中,后台有断点,程序还没走完,前台界面有刷新了几遍,结果后台出现异常。原因是事务锁导致。何为锁,
锁
锁是计算机协调多个进程或线程访问某一个资源的机制。在数据库中,除传统的计算资源(CPU、RAM、IO)的争用意外,数据也是一种许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问的一个重要因素。从这个角度来说,锁对数据库尤其重要,也更加复杂。
死锁
发生死锁后,InnoDB一般都能自动检测到,并使一个事务释放锁并回退,另一个事务获得锁,继续完成事务。但在涉及外部锁,或涉及表锁的情况下,InnoDB并不能完全自动检测到死锁,这需要通过设置锁等待超时参数 innodb_lock_wait_timeout来解决。需要说明的是,这个参数并不是只用来解决死锁问题,在并发访问比较高的情况下,如果大量事务因无法立即获得所需的锁而挂起,会占用大量计算机资源,造成严重性能问题,甚至拖跨数据库。我们通过设置合适的锁等待超时阈值,可以避免这种情况发生。
如何快速解决:
第一:
执行:SELECT * FROM information_schema.INNODB_TRX 语句;查出正在执行的事务 ;
第二:
执行: SHOW PROCESSLIST 查看进程:找出死锁对应的进程id;
第三:
执行:kill id; 如:kill 1