Hibernate 的锁机制说明:
解决数据并发访问------锁
乐观锁:
hibernate通过应用程序来创建的锁,并不是数据库地层的锁.所谓乐观是对事务的并发访问数据的乐观态度(访问一个数据的时候,没有其他程序访问该数据.
当更新的时候,会检查在使用数据的时候是否有程序对该数据进行更新,就放弃操作,否则,就进行更新)
当用户使用数据的时候认为没有别人和自己进行并发访问;
当使用完后,在进行数据更新的时候,会进行判断,如果
在我使用这个数据的时候有别的人已经使用这个数据,就
放弃已有操作,否则,则进行相关操作。
hibernate 会帮助我们判断数据是否被别人使用。
hibernate 通过版本对比的方式来完成判断的。.
例子:
创建表:
create table t_test(
id integer primary key,
name varchar2(12) not null,
ver integer
);
xxx.hbm.xml 配置文件:
<class neme="Test" table="t_test">
<id name="id" type="java.lang.Integer(也可以用hibernate提供的中间的类型integer)">
<generator class="increment"/>
</id>
<version name="version" column="ver" type="integer"/> //必须写在id和property之间,type值必须是java.lang.Integer类型。
<property name="name" column="name" type="java.lang.String(也可string)"/>
</class>
悲观锁:对应数据库中的锁,当操作一条数据的时候,马上通过数据库为这条记录加锁,等使用完之后别的拥护才可以进行操作。效率低,串访问.
如何加悲观锁:针对查询,其它操作,数据库会自动加锁。
for update
hibernate 加入悲观锁:
1. session.get(Test.class,1,LockMode.UPGRADE);
UPGRADE 在加锁时,已经有其他的程序先加锁,等待其他程序释放锁,然后加锁。
UPGRADE_NOWAIT 在加锁时,已经有其他的程序先加锁,就不在等待,放弃。
2. session.load(Test.class,1,LockMode.UPGRADE);
3.Query query = session.createQuery("FROM Test as t");
query.setLockMode("t",LockMode.UPGRADE);
query.uniqueResult();
区别:
1。乐观锁:hibernate通过应用程序来创建的锁。并不是数据库地层的锁。特点:并发效率高,解决并发访问的能力差。
2。悲观锁:对应数据库中的锁。特点:并发效率低,解决并发访问的能力强。