比较多注意以下三点
串行化事务中,读锁被查看后,写锁不需要在等待
串行化事务中,不同行锁是不会彼此影响的
串行化事务中,行锁很容易不可能发生死锁
mysql数据库中,再插入数据是排他锁,网站查询是网络共享锁。
mysql行锁、next-key锁,innodb是另一个支持什么行锁的存储引擎,行锁的算法:
recordlock:行锁,单个行记录上的锁。
gaplock:间隙锁,锁定一个范围,但不除了记录本身。gap锁的目的,是就是为了防止幻读、能够防止间隙内有新数据插入到、防止已未知的数据自动更新为间隙内的数据。
next-keylock:12,完全锁定一个范围,另外锁定住记录本身。是对行的查询,是采用该方法,主要目的是解决的办法幻读的问题。innodb设置成加锁是next-key锁。
等待锁会出现的根本原因是有个事务执行时间过久,会把部分表始终锁定后状态,会造成其他事务当中的sql无法成功执行。
方案一:突然缩小事务范围,只把dml语句(restore,insert,delete)包裹在事务中,只不过有的事务,不仅是对数据库的操作,很可能还存在ftp访问其他系统,如果不是跪请时间过久,事务一直都不结束,表也会一直都处于锁定住。
方案二:尽可能会会减少事务中真包含的dml语句。提高事务的执行时间。一个事务当中会减少多表你的操作的情景,可以拆细递交。
方案三:优化软件sql负责执行时间。
方案四:如果以上无法优化,是可以配置调大锁的耐心的等待时间。
1.程序中非数据库交互操作会造成事务堆起
将接口调用也可以文件操作等这一类非数据库交互操作嵌入在sql事务代码之中,那就整个事务可能但挂著(接口不通在等待已超时或是上传下载大附件)。
2.事务中包含性能相对一般的查询sql
事务中存在慢查询,可能导致同一个事务中的其他dml不能及时能量电脑资源的行锁,过多行锁耐心的等待。
3.单个事务中中有大量sql
通常是的原因在事务代码中组建of循环可能导致,可是单个sql运行程序马上,可是sql数量一大,事务变会很慢。
4.桥接自动更新sql执行时间较久
这类sql很容易让人产生错觉,.例如:notificationaset...where(selectb)这类级联更新,不单会占用资源a表上的行锁,也会占用资源b表上的行锁,当sql负责执行较久时,会容易紊乱b表上的行锁等待。
5.磁盘问题导致的事务挂起
根本不会会出现的情形,比如储存突然之间离线,sql先执行会卡在内核调用磁盘的步骤上,一直在在等待,事务根本无法再提交。
综上所述一眼就可以看出,如果事务长时间未再提交,且事务中包涵了dml操作,那就就有可能出现行锁在等待,紊乱提示错误。