首页 > 编程知识 正文

数据库行锁和表锁,缓存与数据库的一致性

时间:2023-05-05 08:43:11 阅读:31731 作者:212

关系数据库产品引入了隔离级别,以保证事务之间的隔离性。 隔离级别可以确保不同的事务读取效果,而隔离级别可以避免不同的并发副作用和意外现象。 “APP应用程序”和“业务模块”可以根据特定的业务需求和数据准确性允许范围设置数据访问隔离级别。

隔离界在哪些方面控制着事务的隔离性? 的概要包括1、读取数据时是否请求锁定,以及请求的锁定类型。 2、要求进行读取锁定的时间。 3、是否读取由其他事务更改的行在访问时未提交的数据更改,是否在解除对该行的独占锁定之前阻止其他事务,等等。

由此可见,锁定机制是实现数据库隔离性的重要途径。

数据库是实践的知识和技术,数据库的原理往往与实际的数据库操作相差甚远,而数据库锁的原理和机制是数据库知识体系中极少的理论依托部分,数据库锁的原理和机制

的作用和类型很多,一般最常见的分为两个维度:锁的粒度和与锁的兼容性。

根据锁的粒度,锁可以分为行锁、表锁等。 当然,每个制造商的数据库也有不同的锁粒度划分,如表空间锁、数据分区锁等,某些数据库产品可能还有页级锁。 这里介绍了最常见的行锁和表锁。 行锁是指逐行锁定数据,锁定粒度小,发生锁定冲突的概率低,并发性高,但对锁定的开销大,效率慢,容易发生死锁。 另一方面,表锁定是锁定数据库中的表。 表锁具有锁定粒度大、数据访问并发性非常低、发生锁定等现象概率高、锁定使用开销小、锁定效率快的优点。 其他类型的锁定原理相同,只是锁定对象的粒度大小不同,其作用不同,并发效率也不同。

根据锁定数据的可访问性,可以分为共享锁定和排他锁定。 共享锁定也称为读取锁定或s锁定。 被共享锁定锁定的资源可以由其他用户读取,但不能修改。 选择时,对象将被共享锁定,数据读取完成后共享锁定将被解除,可以防止数据在读取时发生更改。 排他锁也称为排他锁、写锁定或x锁定。由排他锁锁定的数据只能由执行锁定操作的事务独占使用,其他事务不能查询或修改锁定的数据。

锁的兼容性划分通常是SS锁兼容,SX、XS、XX不兼容。 这里有一点,只要是未确认读取隔离级别,这个就可以脏读加了x锁的数据。

锁定是保证数据完整性的机制,是必不可少的,但容易引起负面作用的锁定现象和问题。 常见的锁定问题,如死锁、锁定超时等。

死锁是指在两个或多个事务正在执行的情况下,由于每个事务都有锁定的数据资源,并且需要获取其他事务拥有的锁定资源而被阻止,从而使事务之间处于死锁状态。 没有其他作用,事务就不能各自进行。 数据库通常具有自己的死锁检测机制,如果由死锁检测器检测到并检测到数据库中存在死锁,则DBMS根据某些规则杀死事务并解除死锁进行处理。

锁定超时是指在数据库中规定时间值(通常为lock_timeout ),以防止等待事务无限期访问其他数据资源的事务解锁,而等待的事务是该时间值因此,死锁和锁定超时会导致业务程序失败次数的增加,消耗资源,降低效率,在数据库访问执行中应尽量避免。

实际上,以上讨论的锁定问题是悲观锁定机制下的数据锁定问题。 从另一个层面划分,可以分为乐观锁定模式和悲观锁定模式。 乐观锁定模式是一种通过在表结构中添加版本号和时间戳等字段(而不对数据资源使用锁定),程序将版本号与时间戳进行比较来控制表中数据的完整性的模式。 由于乐观锁定模式很少使用数据库锁定机制,因此数据库的DBA通常很少受到关注,主要由程序员根据业务需求实现。 乐观事务的缺点是,如果多个会话发生写入冲突,则只有一个会话成功,其他会话失败。 乐观锁定模式下的写入失败基本上需要依赖程序来解决。 必须在程序中添加重试机制。 重试是指在失败后重新运行事务。

由于并发事务通常不会同时修改同一行,因此在乐观锁定模式下,可以跳过获取行锁定的过程以提高性能。 当然,如果假设并发事务在极端情况下频繁修改同一行,则乐观事务的性能也可能低于悲观事务。 因此,要采用乐观锁定模型,必须根据业务系统和数据情况进行设计。

达梦技术社区

https://eco.dameng.com

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