MySQL数据库锁的原因及解决方案
数据库中有锁的两种基本类型:独占锁,X锁和共享锁(共享锁,锁的)。当数据对象添加到它的锁,其他事务不能读取和修改,共享锁的数据对象可以被其他事务读取,但不能修改。数据库采用这两种基本的锁类型的交易数据库的并发控制。
第一例死锁
一个用户一个访问表A(锁定表A),然后访问表B;另一个用户B访问表B(锁定表B),然后尝试访问表A;然后用户因为用户有一个B锁定表B,它必须等待B用户的释放,以同样的用户b给用户一个释放表A继续,这个死锁是生成的。
uff1a解
这种僵局是比较常见的,由于程序的错误,并没有其他的方式来调整程序的逻辑,程序的逻辑分析,数据库的多表操作,尽量按照相同的顺序处理,尽量避免和锁资源,如A、B两桌,总是根据B的顺序,同时必须锁定两种资源,保证在任何时候都应该以相同的顺序来锁定资源。
僵局第二例
一个用户的查询记录,然后修改记录;然后用户B修改记录,然后锁定用户的交易特性,通过查询一个共享锁试图上升到独占锁,而用户B的专用锁,因为有一个共享锁,所以我必须等待一个发布和共享锁B由于独占锁起来的独占锁是不可能释放共享锁,所以是一个僵局,僵局更加隐蔽,但它经常发生在更大的项目。如果一个按钮被点击网页上的一个项目,按钮是不会立即失效,使用户会点击该按钮几次多次,因此同样的代码可以很容易地操作对数据库相同的记录好几次。
uff1a解
1、对于按钮等控件,单击后立即失效,不允许用户重复点击,避免同时出现同一记录。
2,使用乐观锁进行控制,大多数乐观锁基于数据版本(版本)记录机制,即向数据添加版本标识。In database version based solution, it is usually achieved by adding a version field to the database table.When the data is read out, the version number is read together, and then the version number is added when the update is updated.At this time, the version data of the submitted data is compared with the current version information corresponding to the database table. 如果提交的数据的版本号大于数据库表的当前版本号,它将被更新,否则将被认为是过时的。乐观的锁定机制避免数据库在长事务中被锁起来。没有数据库的数据锁定在用户A与B的操作,大大提高了大并发系统的整体性能。Hibernate乐观锁的实现建立在其数据访问引擎。应该指出的是,由于乐观锁机制是在我们的系统中实现,从外部系统操作用户更新不我们的系统控制,所以脏数据可以更新到数据库。
3、使用悲观锁进行控制。悲观锁是由数据库主要实现了基于锁机制,如Oracle的选择。FOR UPDATE语句以确保最大程度的经营垄断,但随之而来的是大量的开销在数据库的性能,特别是长期交易,这往往是难以承受的。作为一个金融系统,当操作者读取用户的数据,和修改基于数据读取用户(如更改用户帐户余额),如果悲观锁机制,也就意味着整个操作过程(读取数据,开始修改直到提交整个过程中,修改的结果从运营商甚至运营商到公司ffee时间),数据库记录始终处于锁定状态,你可以想象,如果面对成千上万的并发数百,这种情况将导致灾难性的后果。因此,悲观锁的使用必须考虑。
死锁第三例
如果事务中执行不符合要求的UPDATE语句,则执行整个表扫描,并将行级锁提升到表级锁。在执行了许多这样的事务之后,很容易产生死锁和阻塞。同样,当表中的数据量很大或索引太小或不合适时,系统就会变得越来越慢,最终会阻塞或死锁。
uff1a解
不要在SQL语句中使用与多个表相关联的复杂查询;使用执行计划分析SQL语句,并为完全扫描的SQL语句设置相应的索引。
5。总结
一般来说,内存泄漏和锁定表都是由贫穷引起的代码书写,提高代码的质量是最根本的解决办法。有人认为,意识到有必要实现的功能首先是错误的,当有错误在测试阶段。作为一个产品的质量是在制造工艺决定的,而不是质量检验的决定,在软件设计的质量和编码阶段就已经决定了,只是一个测试来验证软件的质量,因为测试不可能发现所有的bug的软件。