您的位置:首页 > 其它

hibernate中的悲观锁_乐观锁解决事物并发的问题

2016-10-05 13:39 441 查看

hibernate中的悲观锁_乐观锁解决事物并发的问题

事物并发:

当多个事物同时进行的时候,对产生数据库的真实性产生一定的影响


隔离机制:

为了解决数据库事务并发运行时的各种问题数据库系统提供四种事务隔离级别:

1. Serializable 串行化

2. Repeatable Read 可重复读

3. Read Commited 可读已提交

4. Read Uncommited 可读未提交

hibernate中的悲观锁和乐观锁

当数据库中存在一组数据,某个用户在取值的时候,并在该值的基础上操作,另外一个用户在该用户取

值之后,并在他操作之前存,对该值在数据库中进行了修改,那么第二用户的操作,就影响了真实结果的

得出

这时,我们需要给我们的数据加一把锁,在我操作完之前,谁也不能动它,这就避免了其他用户的干扰

hibernate中的乐观锁:

乐观锁,大多是基于数据版本(Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,
在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个“version”字段来实现。读取出数据时,
将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,
如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
乐观锁,也就是采取乐观的态度,认为除了hibernate会对数据库进行操作之外,其他程序不会直接对数据库进行修改

乐观锁的具体使用:annotation版本


public class Account {
private int version;
....
public void setVersion(int version) {
this.version = version;
}
@version
public int getVersion() {
return version;
}
....
}


xml版本
而在映像文件中,我们使用optimistic-lock属性设定version控制,<id>属性栏之后增加一个<version>标签,如下:


<hibernate-mapping>
<class name="onlyfun.caterpillar.Account" talble="ACCOUNT"
optimistic-lock="version">
<id...../>
<version name="version" column="VERSION"/>
....
</class>
</hibernate-mapping>


hibernate中的悲观锁:

悲观锁,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。
悲观锁,采取悲观的态度,认为除了我hibernate自身,别人也会动我的数据,那么就直接给数据上锁,让别人无法对我的数据进行修改

悲观锁的具体实现
而在映像文件中,我们使用optimistic-lock属性设定version控制,<id>属性栏之后增加一个<version>标签,如下:


String sql="查询语句";
Query query=session.createQuery(sql);
query.setLockMode("对象",LockModel.UPGRADE);


setLockMode第二个参数
LockMode.NONE:无锁机制。
LockMode.WRITE:Hibernate在Insert和Update记录的时候会自动获取。
LockMode.READ:Hibernate在读取记录的时候会自动获取。这三种加锁模式是供hibernate内部使用的,与数据库加锁无关:
LockMode.UPGRADE:利用数据库的for update字句加锁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: