首页 > 编程知识 正文

mysql中如何给某行数据加锁,oracle什么情况下会锁表

时间:2023-05-06 04:00:13 阅读:31728 作者:2313

数据库与操作系统一样,是多用户使用的共享资源。 如果多个用户同时访问数据,则数据库中可能会发生多个事务同时访问同一数据的情况。 如果不控制并发操作,可能会读取和存储不正确的数据,从而破坏数据库的完整性。 封锁是实现数据库并发控制的一项非常重要的技术。 实际APP应用程序中常见的与锁定相关的异常情况是,两个事务需要一组冲突的锁定,如果事务无法继续,则会发生死锁,严重影响APP应用程序的成功执行。

数据库有两种基本的锁定类型:独占锁定(Exclusive Locks,即x锁定)和共享锁定(Share Locks,即s锁定)。 如果数据对象被排他锁定,则其他事务无法读取或修改它。 具有共享锁定的数据对象可以由其他事务读取,但不能修改。 数据库使用这两种基本的锁定类型来同时控制数据库的事务。

死锁的第一种情况

当一个用户a访问表a、锁定表a、然后访问表b的另一个用户b访问表b、锁定表b、然后尝试访问表a时,用户a认为用户b锁定表b

解决方法:

此死锁的常见原因是程序错误,除了调整程序逻辑之外别无选择。 仔细分析程序逻辑,对于数据库的多表操作,尽量按照相同的顺序进行处理,避免同时锁定两个资源。 例如,在操作a和b两个表的情况下,总是按照a和b的顺序处理,保证在必须同时锁定两个资源的情况下,应该随时按照相同的顺序锁定资源。

死锁的第二种情况

用户a查询记录并修改记录; 此时,用户b修改该记录。 在这种情况下,用户a事务中的锁定的性质试图从查询的共享锁定上升到排他锁定,但是用户b中的排他锁定具有a的共享锁定,必须等待a释放共享锁定,使得a不能由于b的排他锁定而上升这个死锁是隐藏的,但在稍微大一点的项目中经常发生。 在某些项目中,单击页面上的按钮后,没有立即禁用该按钮,因此如果用户多次快速单击同一按钮,并且同一代码多次操作数据库中的同一记录,则更容易发生此死锁

解决方法:

1、对于按钮等控件,点击后立即禁用,避免用户多次点击,同时避免操作同一条记录。

2、使用乐观锁定进行控制。 许多乐观锁定是基于版本记录机制实现的。 也就是说,向数据中添加版本id。 通常,通过在数据库表中添加" version "字段来提供基于数据库表的版本控制解决方案。 读取数据时,一起读取此版本号,然后更新时,在此版本号上加1。 此时,将提交数据的版本数据与数据库表对应的记录的当前版本信息进行对照,如果提交数据的版本号大于数据库表的当前版本号则进行更新,否则视为过期数据乐观锁定机制避免了数据库锁定在长事务中的开销,避免了数据库数据在用户a和用户b操作过程中被锁定,大大提高了系统在大量并发操作中的整体性能。 Hibernate在数据访问引擎中内置了乐观的锁定实现。 值得注意的是,乐观锁定机制在我们的系统中实现,来自外部系统的用户更新操作不受我们的系统控制,因此脏数据可能会更新到数据库中。

3、用悲观的锁控制。 悲观的锁定通常通过数据库锁定机制(如Oracle select…for update语句)实现,以最大限度地确保操作的独占性。 但是,这将导致数据库性能方面的巨大开销。 特别是在长事务中,这种开销往往是无法承受的。 像金融系统一样,一个操作员读取用户的数据,根据读取的用户数据进行修改,比如改变用户账户余额,如果采用悲观的锁定机制,操作的全过程(操作员是否读取数据,开始修改) 此外,还包括操作员中途去煮咖啡的时间),数据库记录始终处于锁定状态,如果面对数百个并发的情况,用可能的悲观锁定控制时,请务必考虑这种情况。

死锁的第三种情况

如果事务执行了不符合条件的update语句,则执行所有表扫描,将行级锁定提升为表级锁定。 当执行多个这样的事务时,很容易发生死锁和阻塞。 在同样的情况下,如果表中的数据量非常大,索引太少或不合适,整个表的扫描就会频繁发生,最终导致APP应用程序系统变慢,最终导致块和死锁。

解决方法:

在SQL语句中,对多个相关表的查询不要太复杂。 使用“执行计划”分析SQL语句,并为具有所有表扫描的SQL语句创建和优化适当的索引。

5 .总结

一般来说,内存溢出和锁定表的产生是代码写得不好,提高代码质量是根本的解决方案。 也有人认为先安装功能,有错误时在测试阶段进行修正的想法是错误的。 正如一个产品的质量是由制造过程而不是质量检验决定的一样,软件的质量在设计和编码阶段就已经决定了。 测试只是软件质量的验证。 因为测试找不到软件中的所有错误。

您感兴趣的文章:MySQL锁(表锁、行锁、共享锁、独占锁、间隙锁)请使用详细的解

共享mysql锁定表和解锁语句

MySQL行级锁定、表级锁定和页级锁定详细信息

有关Mysql数据库锁定机制的详细信息

MYSQL锁表问题的解决方法

mysql数据库死锁的原因及解决方案

MySQ

L死锁问题分析及解决方法实例详解

MySQL中Innodb的事务隔离级别和锁的关系的讲解教程

mysql 锁表锁行语句分享(MySQL事务处理)

查找MySQL线程中死锁的ID的方法

mysql锁定单个表的方法

mysql共享锁与排他锁用法实例分析

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。