浅谈数据库的锁和隔离级别的关系

        锁作为数据库中的一个重要机制,在所有的关系数据库中都作为重要的部分存在,各类数据库可能在锁的类型和细节方面有细微差别,但是锁的机制原理都是一样的。

        锁机制在计算机技术的很多方面都有应用,

        比如操作系统,在文件系统管理方面也使用了锁机制。

        以及在多线程编程中,都会通过锁机制进行隔离来保证操作数据的一致性。这种隔离通过锁机制实现,在程序运行方面可以在线程上进行锁机制的应用。

        数据库是一个多用户使用的共享资源,当多个用户并发地存取数据时在数据库中就会产生多个进程同时存取同一数据的情况。

        在数据库运行期间,多个应用程序进程可能会同时请求访问数据库中同一数据,锁定机制用于在此类情况下维护数据完整性。

        例如,防止两个应用程序进程同时更新数据库中表的同一行数据,加锁是实现数据库并发控制的一个非常重要的技术。

        数据库的锁机制从本质上来说就是一种并发控制。

        若对并发操作不加控制就可能会存取不正确的数据,破坏数据库的一致性,所以数据库管理系统必须提供并发控制机制。

        如果并发没有进行控制,并发操作会导致数据不一致性,出现包括如:丢失修改、不可重复读和读“脏”数据、幻像读等现象。

        为了防止并行性出现数据不一致性的意外,由此使用了一种隔离机制把并行的进程或事务隔离开来,于是引入了数据库的锁机制。

        也就是说,目的是为了把并行的进程或者事务进行隔离,加锁作为一种机制和手段。

        应用程序进程涉及执行一个或多个程序,并且是数据库分配资源和锁定时面向的单元,而所有的SQL程序都作为应用程序进程的组成部分执行。

        在数据库运行层面,数据库的操作是由事务来完成,所以数据库的隔离机制和锁机制也都是通过控制事务的执行来实现的。

        事务是数据库执行的最小的逻辑执行单元,也是数据库并发控制的基本单位。事务就是数据库管理系统执行过程一组数据库操作,是一个逻辑单位,事务就是要保证一组数据库操作要么全部成功,要么全部失败。其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。

        事务具有四个重要特性,即原子性(Atomicity)、一致性(Consistency)、隔离性 (Isolation)、和持久性 (Durability)。任何关系数据库必须支持事务的ACID属性。

        锁的主要作用,是提供事务所需的隔离。

        隔离确保事务之间不会相互干扰,此外锁提供的隔离性有助于保证数据的一致性。通过锁实现隔离,达到保证数据一致性的效果和目的。

        没有锁,一致的事务处理也是不可能的,锁机制是为事务隔离性服务的。

        当事务在对数据库中的某个数据对象进行操作之前,先向数据库系统发出请求,对数据对象进行加锁。

        加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务根据隔离情况决定能或者不能,对此数据对象进行某些指定操作。

        对于事务的执行,不同类型的数据库产品有不同的执行方式。

Oracle和DB2的事务总是隐式开始,没有用来开始事务的语句。

而在Microsoft Access、Microsoft SQL Server、MySQL和PostgreSQL中,可以使用BEGIN语句显式开始事务。

而以SQL标准来说,SQL:1999引入START TRANSACTION语句,但是由于SQL:1999这个"START TRANSACTION"是在很多数据库产品使用了BEGIN开始事务很久之后引入的,因此不同的数据库扩展BEGIN的语法也各不相同。

MySQL和PostgreSQL支持START TRANSACTION,作为BEGIN的同义词。

        加锁机制是为了保证事务隔离,那么可以指定隔离级别,来实现在数据库对象上实现不同的锁资源情况。

        不同的隔离级别控制不同并发程度,

较高的隔离级别减少了并发带来的不可重复读和幻像读等意外副作用,但增加了事务之间阻塞的可能性,即需要更长时间等待其他事务释放锁。

而较低的隔离级别可以增强并发访问数据的能力,但增加了可能遇到的不可重复读和幻像读等并发副作用。

介于并发安全与并发效率之间的平衡,一般不会一味地提高事务隔离级别来保证事务并发安全性,应平衡应用程序的数据完整性要求与每个隔离级别的副作用,在此基础上选择相应的隔离级别。

        标准SQL规范中定义的四个事务隔离级别:(1)READ UNCOMMITED  (2)READ COMMITED  (3)REAPATABLE READ  (4)SERIALIZABLE。

而不同的厂家在设计、实现不同的数据库产品时,根据各自产品和市场需求实现了不同的隔离级别。

以当前市面上几种常见的数据库为例,

DB2                               Repeatable read    Read stability    Cursor stability    Uncommitted read
Oracle                           Serializable            Serializable      Read committed    Read committed
Microsoft SQLServer    Serializable      Repeatable read    Read committed    Read Uncommitted

可以看到oracle数据库实现了2种隔离级别,SQLserver完全按照标准规范实现了4种隔离级别,而DB2数据库虽然实现了4种隔离级别,但却和SQL标准规范不完全一致。

不同的隔离界别可以避免不同的并发副作用。以DB2数据库事务的隔离级别为例,其隔离级别也有4个。由低到高依次为uncommitted Read 、Cursor stability、Read stability、Repeatable read。这四个级别能够逐个解决脏读、不可反复读、幻读这几类问题。

达梦技术社区 https://eco.dameng.com

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值