悲观锁、乐观锁和数据库的锁之间的关系

首先悲观锁和乐观锁是基于业务逻辑来讲的,他们和数据库的锁是不同的概念,数据库的锁是实现数据库事务的机制。

乐观锁就在并发情况下,避免覆盖更新的一种机制,是程序员自己通过添加一个version字段实现,每次load数据都读出这个字段,在更新的时候比较下这个version字段是否一致而避免覆盖了不同的版本。至于他为什么叫乐观锁就是因为认为他的并发情况不高,即使发生并发导致更新失败也可以忍受。(适度控制并发,占用资源少,性能高,当然完全放任不管性能更高,根本不占用资源)

而悲观锁是基于数据库的锁机制来实现的(可以理解为我用了事务就是使用了基于数据库的锁机制来实现悲观锁),直接通过锁住并发的资源,来减少并发产生的问题,数据库做到这一点的就是事务啦。

数据库事务和锁机制是密不可分的,数据库事务就是通过锁机制来实现的,并且数据库事务隔离级别就是因为不同的级别,而采用不同的数据库锁,也这是数据库锁机制和事务隔离级别之间的关系。

如下是测试代码。

case 1 ================================

窗口1

begin tran
select * From tb_test  where id=1

窗口2

update tb_test set content=‘yyy	‘ where ID=1

result:  (1 row(s) affected)

这里采用了默认隔离级别,所以查询是没有加锁,也可以正常更新。

case 2 ================================

窗口1

begin tran
select * From tb_test with (updlock) where id=1

窗口2

update tb_test set content=‘yyy	‘ where ID=1

result: 无

这里发生了堵塞,因为这里显示使用了U锁。

case 3 ================================

窗口1

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

begin tran

select * From tb_test  where id=1

窗口2

update tb_test set content=‘yyy	‘ where ID=1

result:无

这里也发生了堵塞,我并没有显示使用U锁,但是是使用了更高级别的隔离级别,这里的隔离级别默认把SELECT查询添加了U锁,所以也导致了另外一个连接无法更新。

这里也看出了不同的隔离级别和不同的锁之间的关系,不同隔离级别是基于不同的锁来实现的。

原文地址:https://www.cnblogs.com/luxiaobin/p/10821870.html

时间: 2024-11-09 02:22:29

悲观锁、乐观锁和数据库的锁之间的关系的相关文章

[数据库事务与锁]详解四: 数据库的锁机制

注明: 本文转载自http://www.hollischuang.com/archives/898 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念. 并发控制 在计算机科学,特别是程序设计.操作系统.多处理机和数据库等领域,并发控制(Concurrency control)是确保及时纠正由并发操作导致的错误的一种机制. 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存

数据库和表之间的关系

数据库: 数据库即数据的仓库.在数据库中提供了专门的管理系统.对数据库中的数据进行集中的控制和管理.能高效的对数据库进行存储.检索. 关系型数据库: 关系模型把世界看作是由实体(Entity)和联系(Relationship)组成的. 关系模型数据库是一种以表做为实体,以主键和外键关系作为联系的一种数据库结构. 在关系数据库中,相类似的实体被存入表中.表(table)是关系型数据库的核心单元,它是数据存储的地方. 关系数据库管理系统: 关系型数据库只是一个保存数据的容器,大多数数据库依靠一个称为

Oracle锁2:DML操作和锁

Oracle为DML操作自动获取行锁和表锁,操作的类型决定了锁的行为,下面对DML操作锁的情况作了一个汇总: SQL Statement Row Locks Table Lock Mode RS RX S SRX X SELECT ... FROM table... -- none Y Y Y Y Y INSERT INTO table ... Yes SX Y Y N N N UPDATE table ... Yes SX Y(注) Y(注) N N N MERGE INTO table ..

全局数据库名称.数据库名称.SID是什么关系?

关于数据库名(db_name).实例名(instance_name).ORACLE_SID 最近因看到论坛有人问起这方面的东西,将自己的理解加上查阅相关资料整理如下,如果不全或不当的地方,望指正并补全它. 数据库名(DB_NAME).实例名(Instance_name).以及操作系统环境变量(ORACLE_SID) 在ORACLE7.8数据库中只有数据库名(db_name)和数据库实例名(instance_name).在ORACLE8i.9i中出现了新的参数,即数据库域名(db_domain).

Hibernate 悲观锁,乐观锁

业务逻辑的实现过程中,往往需要保证数据访问的排他性.因此,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的"锁",即给我们选定的目标数据上锁,使其无法被其它程序修改. Hibernate 支持两种锁机制: 1. 悲观锁(Pessimistic Locking) 从加载对象就开始锁定.修改过程中一直是锁.直到事务commit()提交后再解锁. session.load(Info.class,"p003",LockOp

【MySQL】悲观锁&乐观锁

悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.本文将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍. 悲观锁(Pessimistic Lock) 悲观锁的特点是先获取锁,再进行业务操作,即"悲观"的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作.通常所说的"一锁二查三更新"即指的是使用悲观锁.通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select - for update操作来实现

事物(悲观,乐观)锁

(参考,待整理) 事务也是包含一系列sql语句的集合:但它并不像存储程序那样有自己的名字,它只是用于设定内部一系列的sql语句中某一条出现错误时,该如何处理后续的操作. 事务的特性(ACID): 原子性(Atomicity)[不可分割的最小单元] 一致性(Consistency)[事务成功或失败,数据的状态保持一致] 隔离性(Isolation)[每个事务都独立执行,同时执行的事务互不干扰] 持久性(Durability)[事务提交后,对数据的修改会被永久保存] 数据库事务有以下部分组成: 一个

多线程之 悲观锁,乐观锁

1.悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系 统不会修改数据). 数据库锁机制: 1        未提交读(read uncommitted) 2        提交读(read committed) 3        重复读(r

谈谈mysql的悲观和乐观锁

悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.之前有写过一篇文章关于并发的处理思路和解决方案,这里我单独将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍一次吧. 悲观锁(Pessimistic Lock) 悲观锁的特点是先获取锁,再进行业务操作,即"悲观"的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作.通常所说的"一锁二查三更新"即指的是使用悲观锁.通常来讲在数据库上的悲观锁需要数据库本身提供支持,