Hibernate事务并发处理相关总结

1.事务的ACID特性。

Atomic原子性  Consistency一致性   Isolation隔离型   Durability持久性 

2.事务并发时可能出现的问题

(1)dirty read——脏读,读取了其他事务还没有提交的数据。

(2)non-repeatable read——不可以重复读,指在一个事务进行过程中,另外一个事务更新了数据,导致该事物对同一条记录的读取前后不一致。

(3)phantom read——幻读,在一个事务进行过程中,另外一个事务插入或删除了记录,导致该事务前后读取的记录数不一致。

3.数据库的事务隔离机制

数据库的事务隔离机制有4个隔离级别,可以从java.sql.Connection接口的静态常量中查到,分别为:

(1)read_uncommitted,可以读取其他事务未提交的数据,会出现脏读、不可重复读、幻读的问题。

(2)read_committed,可以读取其他事务已提交的数据,避免了脏读,可能会出现不可重复读、幻读的问题。

(3)repeatable_read,可以重复读,实现的方式是当读取一些数据时,在这些数据上加锁,在该事务结束前别的事务都不能对这些数据进行更新,可能会出现幻读。

(4)serializable,序列化,指不管有多少个事务并发,都是按照序列顺序一个一个地依次执行,该级别可以避免一切事务并发问题。

4.hibernate的事务隔离级别

4.1  hibernate事务隔离级别的配置

    通过在hibernate.cfg.xml文件中配置属性<property name="hibernate.connection.isolation"></property>来设定hibernate事务的隔离级别,值1, 2, 4, 8分别对应着上述4种事务隔离级别。

4.2 hibernate中乐观锁和悲观锁

(1)前提

为了兼顾事务并发处理的效率,通常把hibernate事务隔离级别设定为2,此时可能出现不可重复读和幻读的问题,对于幻读在实际中很少出现,而且幻读是进行插入、删除出现的问题,而事务并发主要考虑更新的问题,故对于幻读实际中通常不予考虑,而对于不可重复读的问题,在Hibernate中通常采用乐观锁、悲观锁的方式进行处理。

(2)悲观锁(Pessimistic Lock)

说明:指认为在我当前事务进行过程中肯定会有其他事务前来对数据进行更新操作,故当前事务取出数据后就依赖底层数据库在所取数据上加锁,在当前事务结前别的事务不能对这些数据进行操作。

在hibernate中的实现方式: 在load对象时使用load()带锁模式(LockMode)的重载方法,把LockMode设为LockMode.PESSIMISTIC_READ

(3)乐观锁(Optimistic Lock)

说明:指乐观的认为在我当前事务进行过程中不会有其他事务来对数据进行更新操作,不依赖与底层数据库的锁,而是在实体表上加一个version字段,初始值为0,每当有事务对他进行更新了该值就加1,如果有一个事务提交时发现该数据的verison值与它取这条数据时的值不一样了,就说明有其他事务对他进行更新了,就会报错。

在hibernate中的实现方式:在实体类上加version属性,并在该属性上加@Version注解。

猜你喜欢

转载自hgdhot.iteye.com/blog/2271903