mysql数据库锁的产生原因及解决办法

2019-01-04 16:09:45丽君

3、使用悲观锁进行控制。悲观锁大多数情况下依靠数据库的锁机制实现,如Oracle的Select … for update语句,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。如一个金融系统, 当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时(如更改用户账户余额),如果采用悲观锁机制,也就意味着整个操作过程中(从操作员读 出数据、开始修改直至提交修改结果的全过程,甚至还包括操作员中途去煮咖啡的时间),数据库记录始终处于加锁状态,可以想见,如果面对成百上千个并发,这 样的情况将导致灾难性的后果。所以,采用悲观锁进行控制时一定要考虑清楚。

死锁的第三种情况

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

解决方法:

SQL语句中不要使用太复杂的关联多表的查询;使用“执行计划”对SQL语句进行分析,对于有全表扫描的SQL语句,建立相应的索引进行优化。
5.小结
总体上来说,产生内存溢出与锁表都是由于代码写的不好造成的,因此提高代码的质量是最根本的解决办法。有的人认为先把功能实现,有BUG时再在测试阶段进 行修正,这种想法是错误的。正如一件产品的质量是在生产制造的过程中决定的,而不是质量检测时决定的,软件的质量在设计与编码阶段就已经决定了,测试只是 对软件质量的一个验证,因为测试不可能找出软件中所有的BUG。

您可能感兴趣的文章:

mysql锁表和解锁语句分享MySQL行级锁、表级锁、页级锁详细介绍通过mysql show processlist 命令检查mysql锁的方法MySQL Innodb表导致死锁日志情况分析与归纳Mysql数据库锁定机制详细介绍MYSQL锁表问题的解决方法详解MySQL中的死锁情况以及对死锁的处理方法一次Mysql死锁排查过程的全纪录mysql 数据库死锁原因及解决办法MySQL死锁问题分析及解决方法实例详解mysql 锁表锁行语句分享(MySQL事务处理)MySQL中Innodb的事务隔离级别和锁的关系的讲解教程Mysql(MyISAM)的读写互斥锁问题的解决方法mysql锁定单个表的方法查找MySQL线程中死锁的ID的方法Mysql使用kill命令解决死锁问题(杀死某条正在执行的sql语句)Mysql 数据库死锁过程分析(select for update)MySQL锁(表锁,行锁,共享锁,排它锁,间隙锁)使用详解