- 浏览: 5819413 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
悲观锁Pessimistic
悲观锁的实现,通常依赖于数据库机制,在整个过程中将数据锁定,其它任何用户都不能读取或修改
一旦使用了悲观锁,load的lazy会失效
看下面的例子:
乐观锁optimistic
原理:大多数基于数据版本记录机制(version)实现,一般是在数据库表中加入一个version字段
读取数据时将版本号一同读出,之后更新数据时版本号加一,如果提交数据时版本号小于或等于数据表中的版本号,则认为数据是过期的,否则给予更新
乐观锁配置:
乐观锁测试一下:
悲观锁的实现,通常依赖于数据库机制,在整个过程中将数据锁定,其它任何用户都不能读取或修改
一旦使用了悲观锁,load的lazy会失效
看下面的例子:
import org.hibernate.LockMode; import org.hibernate.Session; import junit.framework.TestCase; public class PessimisticLockingTest extends TestCase { //如果第一个人执行这个方法,执行到一半,然后走了 public void testLoad1() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Inventory inv = (Inventory)session.load(Inventory.class, 1, LockMode.UPGRADE);//锁住,不让别人操作 System.out.println("itemName=" + inv.getItemName()); System.out.println("quantity=" + inv.getQuantity()); inv.setQuantity(inv.getQuantity() - 200); session.update(inv); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } //第二个人不能加载数据了,堵塞住了(一直等待),只有当第一个用户释放了,代码才能继续执行下去。 public void testLoad2() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Inventory inv = (Inventory)session.load(Inventory.class, 1, LockMode.UPGRADE); System.out.println("itemName=" + inv.getItemName()); System.out.println("quantity=" + inv.getQuantity()); inv.setQuantity(inv.getQuantity() - 200); session.update(inv); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } }
乐观锁optimistic
原理:大多数基于数据版本记录机制(version)实现,一般是在数据库表中加入一个version字段
读取数据时将版本号一同读出,之后更新数据时版本号加一,如果提交数据时版本号小于或等于数据表中的版本号,则认为数据是过期的,否则给予更新
public class Inventory { private int itemNo; private String itemName; private int quantity; private int version;//新增版本字段,用户检测数据是否是最新的。 //setter,getter }
乐观锁配置:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.bjsxt.hibernate.Inventory" table="t_inventory" optimistic-lock="version"> <id name="itemNo"> <generator class="native"/> </id> <!--version必须配置在主键后面--> <version name="version"/> <property name="itemName"/> <property name="quantity"/> </class> </hibernate-mapping>
乐观锁测试一下:
import org.hibernate.LockMode; import org.hibernate.Session; import junit.framework.TestCase; public class OptimisticLockingTest extends TestCase { //如果第一个人先执行这个方法,执行到一半,然后走了 public void testLoad1() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Inventory inv = (Inventory)session.load(Inventory.class, 1); System.out.println("itemName=" + inv.getItemName()); System.out.println("version=" + inv.getVersion()); System.out.println("quantity=" + inv.getQuantity()); inv.setQuantity(inv.getQuantity() - 200); session.update(inv); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } //这个时候第二个人执行这个方法,并且执行完毕;然后第一个人回来了,继续执行第一个方法会发现异常,因为数据库内部对比了版本号发现不对,所以抛异常了。(数据过期) public void testLoad2() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Inventory inv = (Inventory)session.load(Inventory.class, 1); System.out.println("itemName=" + inv.getItemName()); System.out.println("version=" + inv.getVersion()); System.out.println("quantity=" + inv.getQuantity()); inv.setQuantity(inv.getQuantity() - 200); session.update(inv); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } }
发表评论
-
DetachedCriteria查询实例
2010-07-20 15:52 2110项目中用到了DetachedCriteria,顺便记下来 De ... -
hibernate学习12之Collection(集合)映射
2010-01-28 11:09 2012set list array map 的映射。 集合映射会发 ... -
hibernate学习11之composite(复合)主键映射
2010-01-28 10:50 2197复合主键映射可以看作是组件映射的一个特例. <!D ... -
hibernate学习10之component(组件)映射
2010-01-28 10:34 1840在hibernate中,component是某个实体的逻辑组成 ... -
hibernate学习9之extends(继承)映射
2010-01-28 10:19 3013hibernate.cfg.xml: <!DOCTY ... -
hibernate学习8之lazy策略
2010-01-27 17:44 1929hibernate lazy策略可以使用在: * <c ... -
hibernate学习7之many-to-many双向关联
2010-01-27 16:54 1865Hibernate.cfg.xml配置同前一节。 imp ... -
hibernate学习6之many-to-many单向关联
2010-01-27 16:40 2434<!DOCTYPE hibernate-config ... -
hibernate学习5之one-to-many双向关联
2010-01-27 16:10 2315一对多双向关联映射: * 在一一端的集合上使用<key ... -
hibernate学习4之one-to-many单向关联(不推荐)
2010-01-27 15:47 4787一对多和多对一的映射策略是一样的,只是站的角度不同. 多对一 ... -
hibernate学习3之one-to-one单向外键关联
2010-01-27 14:55 3106one-to-one关联其实是many-to-one的一种特殊 ... -
hibernate学习2之many-to-one
2010-01-27 14:37 1894public class Group { privat ... -
hibernate学习1之基础工具
2010-01-27 14:21 1793//根据映射文件生成数据库表 import org.hib ... -
Hibernate批量删除出现sql异常Connection is read-only. Queries leading ... are not allowed
2009-12-23 17:48 9145在做批量删除时出现: Connection is read- ... -
PaginationSupport加强版的分页代码
2009-09-21 13:04 4970PaginationSupport.java,这个类网上有,我 ... -
根据用户权限,动态显示用户菜单
2009-09-17 14:48 9886用户权限userPermission,比如[1][2][3][ ... -
数据插入不成功的问题
2009-09-03 13:25 1779检查表的字段名中是否有sql关键字,如use,count,ma ... -
Hibernate的批量更新和删除
2009-08-16 22:03 2137批量更新是指在一个事 ... -
利用myeclipse 生成Hibernate Mapping文件时出现No entries available的解决办法
2009-07-30 23:26 16790在hibernate中,每个数据表对应的其实是一个实体类,每个 ...
相关推荐
在进行Hibernate的测试时,可以创建一个名为`hibernate_test`的项目,编写对应的实体类、映射文件以及测试用例,模拟并发场景,来深入理解并对比悲观锁和乐观锁的差异和效果。 总之,理解并合理运用悲观锁和乐观锁...
Hibernate 锁机制_悲观锁和乐观锁 Hibernate 锁机制是指在数据库访问中,为了维护数据的一致性和正确性,所采取的一些机制来防止数据的并发访问和修改。 Hibernate 中有两种锁机制:悲观锁和乐观锁。 一、悲观锁...
【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。Hibernate,作为Java领域广泛使用的ORM框架,提供了一种处理并发数据访问冲突的手段,那就是锁机制。主要...
与悲观锁不同,乐观锁假设并发环境下数据不会被同时修改,因此在读取数据时不会立即加锁。只有在更新数据时,才会检查数据是否自上次读取后发生了变化。在Hibernate中,通常通过在实体类的映射文件中设置`optimistic...
### Hibernate的乐观锁与悲观锁 #### 一、引言 在并发环境下,尤其是在金融、电商等业务场景中,确保数据的一致性和完整性至关重要。**Hibernate**作为一种流行的Java持久层框架,提供了多种机制来处理并发控制...
《Hibernate 悲观锁与乐观锁详解》 在多用户并发访问的环境中,数据库管理系统必须具备有效的数据访问控制机制,以确保数据的一致性和完整性。Hibernate,作为一款流行的Java持久化框架,提供了两种主要的锁定策略...
在Java的持久化框架Hibernate中,悲观锁和乐观锁是两种重要的并发控制策略,它们用于管理数据库中的数据在多线程环境下的访问安全。本文将深入探讨这两种锁机制的原理、应用场景及其区别。 首先,我们来理解悲观锁...
在处理并发问题时,Hibernate提供了悲观锁和乐观锁两种机制。 悲观锁假设并发环境中的冲突是常态,因此在读取数据时就立即锁定,直到事务结束才释放。在Hibernate中,可以通过设置`@LockModeType.PESSIMISTIC_READ`...
### Hibernate的乐观锁和悲观锁 #### 一、引言 在软件开发中,尤其是在涉及大量并发操作的应用场景下,确保数据的一致性和完整性是非常重要的。对于基于Java Web的应用而言,Hibernate作为一款流行的ORM框架,提供...
### Java中的悲观锁与乐观锁实现详解 #### 一、悲观锁(Pessimistic Locking) 悲观锁是一种基于对数据安全性的保守态度而设计的锁机制。它假设数据在处理过程中很可能被外界修改,因此在整个数据处理过程中都会将...
6. **文件关联**:压缩包中的文件名称列表看似与主题“Hibernate 乐观和悲观锁”不直接相关,"走出软件作坊:三五个人十来条枪 如何成为开发正规军.chm、走出软件作坊.doc"可能是一些关于软件开发团队建设和成长的...
Hibernate 实现悲观锁和乐观锁代码介绍 Hibernate 是一个基于 Java 的持久层框架,它提供了多种锁机制来实现事务的隔离性和一致性。在本文中,我们将详细介绍 Hibernate 实现悲观锁和乐观锁的代码实现,并讨论 ...
Hibernate乐观锁是数据库事务控制的一种策略,主要用于处理并发更新数据的情况。在乐观锁的机制下,假设并发用户很少会发生冲突,所以在读取数据时不会进行任何锁定,而在更新数据时才会检查在此期间是否有其他用户...
乐观锁和悲观锁是数据库和并发编程中常见的两种锁机制,它们主要用于解决多线程环境下的数据一致性问题。在Java面试中,理解这两种锁的概念、工作原理以及适用场景是非常重要的。 乐观锁是一种假设大多数情况下不会...
求助编辑百科名片相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库 性能的大量开销,特别是对长事务而言,...
为了解决这个问题,Hibernate提供了两种锁机制:乐观锁和悲观锁。下面我们将深入探讨这两个概念以及它们在实际应用中的实践。 ### 乐观锁 乐观锁是一种假设大多数情况下不会发生数据冲突的锁策略。在读取数据时不会...
- **乐观锁**:在读取时不加锁,假设不会有并发冲突,只有在更新数据时检查是否被其他事务修改过。通常通过版本号或时间戳实现,如果冲突则事务失败。乐观锁适用于读多写少的情况,减少锁的使用,提高并发性能。 在...
在Hibernate框架中,乐观锁的实现方式之一是通过`version`字段,也就是我们这个练习的主题。`version`字段通常是一个整数或时间戳,记录了数据的版本信息。每次数据更新时,Hibernate会自动将`version`字段加一或者...