<!----><!---->
<!---->
《深入浅出
Hibernate
》一书(作者:夏昕
曹晓钢
唐勇
2005
年版)
第
5
章
Hibernate
高
级
特性
5.1.5
事
务
管理
锁
(
locking
)
关于悲观锁和乐观锁这一部分,作者思路清晰,分析透彻,文笔流畅,举的例子也通俗易懂,令人拍案叫绝!绝对要赞一个!
下面,我补充一个关于悲观锁的测试例子程序:
写个测试类,里面写两个测试方法(代码一样,都是从数据库中
load
出数据,打印出来,接着
set
一个新的余额,最后
commit
),分别用于模拟两个用户对数据库中账户余额表的并发操作。假设此时某账户余额是
100
元人民币,方法
1
和方法
2
都想进行减
20
的操作。
先
debug
运行测试方法
1
的代码,从数据库账户余额表中以悲观锁模式把数据
load
出来,接着执行更新操作(执行了
set
方法,将余额重新设置了(从
100
变成了
80
),此时至于要不要显示地调用
update
方法,则无所谓,因为
Persistent
状态的对象,在
commit
时会自动进行更新的),在执行
commit
方法之前,停住(此时方法
1
没有
commit
,没有提交事务,也就没有释放掉对这条记录的锁);
再来直接运行测试方法
2
。此时会发现测试方法
2
就发了一条
select
语句(想从数据库中查出这条记录),然后就停在那边了,僵住了,在等着,等什么呢?方法
2
在等待方法
1
放掉对这条记录的锁,因为此时这条数据还被方法
1
锁着,此时方法
2
对这条数据进行不了任何操作;
再去继续运行方法
1
,将
commit
方法执行完成后,到数据库中确认,会发现此时的数据已经是方法
1
执行之后的结果了(账户余额是
80
);
再去运行方法
2
,立马运行通过了,此时再到数据库中确认,会发现此时的数据已经是方法
2
(在方法
1
执行后的基础上)执行后之后的结果(账户余额是
60
)。
由此可见,使用悲观锁机制能解决“更新丢失”的问题。至于悲观锁的缺点,我就不重复了,作者已经分析得很透彻了。
关于乐观锁的实现,也可以采用时间戳机制,实现原理(将试图向数据库提交的记录的时间戳和数据库中该记录的当前时间戳进行比较)和使用最为广泛的数据版本机制
Version
也差不了多少。但显然,我们应该优先重点掌握
Version
方式。
还有一点,原文中提到这样一句“
注意
,version
节点必须出现在
ID
节点之后。”
说明一下,这个顺序是在
DTD文件中定义的,受其约束。
分享到:
相关推荐
### 剪切自锁(Shear Locking)解析 #### 一、概述 剪切自锁(Shear Locking)是有限元分析中的一个重要概念,尤其在处理薄板或细长结构时尤为显著。该现象最早在六十年代被发现,当时人们注意到基于位移方法...
HotSpot虚拟机作为Java平台的主流虚拟机之一,提供了多种锁优化策略,其中之一就是“偏见锁”(Biased Locking)。本文将深入探讨HotSpot中的偏见锁机制,以及它如何提高并发性能。 偏见锁是一种针对轻量级锁的优化...
在Linux内核中,锁机制是确保并发执行的线程之间正确同步的关键工具。它用于保护共享资源,防止数据竞争和不一致状态的发生。对于驱动编写者来说,深入理解锁的原理和用法至关重要,因为驱动程序往往需要访问硬件...
在介绍双检锁模式(Double-Checked Locking Pattern,DCLP)的C++实现中,Scott Meyers和Andrei Alexandrescu在其2004年的文章中指出,传统的单例模式实现并不具备线程安全性。单例模式是设计模式中经常被提及的一种...
知识点一:偏向锁(Biased Locking)的起源 偏向锁的概念源自于一篇由Dave、Mark Moir和Bill Scherer共同撰写的论文。作者们指出,传统的Java监控锁(即synchronized锁)在执行CAS操作(比较并交换)时会带来显著的...
InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。 MySQL这3种锁的特性可大致归纳如下。 开销、加锁速度、死锁、粒度、并发性能 l 表级锁:开销小,加锁快;...
《Expert SQL Server Transactions and Locking》是一本专为SQL Server数据库管理员和开发人员编写的权威指南,涵盖了事务处理和锁定机制这两个核心主题。这本书的源码提供了深入理解这些概念的实际示例,对于学习和...
计算EEG信号的相位锁值,MATLAB
### Kernel-Locking:深入理解 Linux 内核中的锁定机制 #### 一、引言与并发问题 本书由 Paul Rusty Russell 撰写,是一份关于 Linux 内核锁定技术的指南,它针对 Linux 内核 2.4 版本进行编写。随着对称多处理...
Oracle提供多种类型的锁,包括行级锁、表级锁、共享锁(S锁)和独占锁(X锁)。S锁允许其他事务读取被锁定的数据,而X锁则阻止其他事务读取或修改。 1. 行级锁定:Oracle默认使用行级锁定,以最大化并发性。当一个...
主要分为两种类型:乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)。 **悲观锁(Pessimistic Locking)** 悲观锁假设数据在任何时候都可能发生并发冲突,因此在数据读取时就对其进行锁定,确保在...
乐观锁在Oracle数据库并发控制中的应用 乐观锁是一种在数据库管理系统中实现并发控制的方法,它假设在多数情况下读多写少的情况,因此在读取数据时不会加锁,只有在更新数据时才会检查在此期间是否有其他事务修改了...
### Kernel Locking 中文版 —— 《Unreliable Guide To Hacking The Linux Kernel》中文版 #### 第1章. 引言 欢迎来到Rusty Russell的《不可靠指南:内核锁定》的中文版。这份文档深入探讨了Linux 2.6内核中的锁...
《C++ and the Perils of Double Checked Locking》是一篇探讨C++编程中双重检查锁定(Double-Checked Locking)模式潜在问题的文献。在多线程编程中,双重检查锁定是一种常见的优化策略,旨在减少对同步原语的依赖...
3. **锁超时**:为了避免因意外情况导致的死锁,Plone.locking设置了锁的超时机制,如果用户在规定时间内未完成编辑,锁将自动释放。 4. **锁状态查看**:用户可以查看当前对象的锁定状态,了解是否可以安全编辑。 5...
3. 使用 Row-Level locking 机制。 4. 避免使用长事务和大量的锁定对象。 5. 使用 Index 机制来提高查询效率。 Sybase 数据库锁机制和锁表查询是数据库管理系统中非常重要的组件,可以帮助数据库管理员了解和优化...
通过阅读"preempt-locking.txt"文件,我们可以获取更深入的技术细节,如具体的代码实现、锁的使用策略、性能分析等。对于Linux内核开发者或者有兴趣深入了解内核并发控制的人员来说,这是一个宝贵的参考资料。
2. **事务支持**:`django-db-locking`与Django的事务管理兼容,这意味着你可以在事务中使用锁,以确保即使在异常情况下也能正确释放锁。 3. **超时和重试机制**:如果锁已被其他进程持有,库会根据配置的超时时间...