hibernate 事务的隔离级别

脏读
不可重复读
幻读
可序列化(符合事务的四个特性的正常情况 )

解释:
脏读:事务A对数据1做了更新,但是还没有来得及提交
此时事务B对数据1进行了查询获得了事务A更新后的数据,
但是事务A因为一些原因又进行了回滚,这就导致数据1回到了
最初状态,那事务B读取的数据就是错误的,这就是脏读

不可重复读:事务A查询了数据1,然后事务B更新了这个数据并进行了
提交,然后事务A又读取了这个数据,两个数据不一致,叫做不可重复读

幻读:事务A查询了a表,里面只有一条数据,然后事务B对a表进行了添加,
现在表里有两条数据,然后事务A又对表a进行了查询,这时候的查询就有两条数据
这种叫做幻读(大多数情况下数据库选择的隔离级别就是这里,允许出现幻读
因为如果要完全符合可序列化,也就是acid 那就表明事务A在执行的时候,其他
的事务就要等着)



Hibernate中的隔离级别
默认设置
Hibernate.connection.isolation= 4
1:读操作未提交(Read Uncommitted) 也就是脏读
2:读操作已提交(Read Committed) 也就是不可重复读
4:可重读(Repeatable Read) 也就是幻读
8:可串行化(Serializable)


可以在hibernate.cfg.xml中配置一行
<property name="hibernate.connection.isolation">4<property>

 

----------------------------------------------------
这是在数据库级别进行设置,也可以在代码方面进行设置
乐观锁
悲观锁

 

 

乐观锁

通过version字段(在数据库中插入一个version字段,数据类型要是整型int或者long等)
或timestamp字段(不推荐,因为在小的时候都有可能会重叠)实现

当对表数据进行添加和修改时,version字段会改变
当修改数据时,Hibernate会获取当前的version值,提交当前事务时,
如果version值和之前获取的不同,那就会抛出org.hibernate.StaleObjectStateException异常。

 

 注解的形式 

@Version
private Integer version;

xml配置的形式

<version name="version"/>

如:

<class name="User" table="user">
        <cache usage="read-write"/>
        
        <id name="id">
            <generator class="native"/>
        </id>
        
        <property name="username"/>
        <property name="password"/>
        
        <set name="addressSet" cascade="delete" inverse="true">
            <cache usage="read-write"/>
            <key column="userid"/>
            <one-to-many class="Address"/>
        </set>
        <!-- 
        <version name="version" column="xxxx"/>
         -->
    </class>

悲观锁 :

当前事务没有完成,其他事务都不能执行
只需要添加一个参数
Account account= (Account) session.get(Account.class,1,LockOptions.UPGRADE);



 

posted on 2015-04-28 16:54  itliucheng  阅读(2031)  评论(0编辑  收藏  举报