Hibernate_事务管理详解

事务(transaction)是数据库管理系统的执行单位,网站空间,可以是一个数据库操作(如Select操作)或者是一组操作序列。事务ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

原子性:保证事务中的所有操作全部执行或全部不执行。例如执行转账事务,虚拟主机,要么转账成功,要么失败。成功,则金额从转出帐户转入到目的帐户,并且两个帐户金额将发生相应的变化;失败,则两个账户的金额都不变。不会出现转出帐户扣了钱,而目的帐户没有收到钱的情况。

一致性:保证数据库始终保持数据的一致性——事务操作之前是一致的,事务操作之后也是一致的,不管事务成功与否。如上面的例子,转账之前和之后数据库都保持数据上的一致性。

隔离性:多个事务并发执行的话,结果应该与多个事务串行执行效果是一样的。显然最简单的隔离就是将所有事务都串行执行:先来先执行,一个事务执行完了才允许执行下一个。但这样数据库的效率低下,香港服务器,如:两个不同的事务只是读取同一批数据,这样完全可以并发进行。为了控制并发执行的效果就有了不同的隔离级别。下面将详细介绍。

持久性:持久性表示事物操作完成之后,对数据库的影响是持久的,即使数据库因故障而受到破坏,数据库也应该能够恢复。通常的实现方式是采用日志。

事务隔离级别(transaction isolation levels):隔离级别就是对对事务并发控制的等级。ANSI/ISOSQL将其分为串行化(SERIALIZABLE)、可重复读(REPEATABLE READ)、读已提交(READ COMMITED)、读未提交(READ UNCOMMITED)四个等级。为了实现隔离级别通常数据库采用锁(Lock)。一般在编程的时候只需要设置隔离等级,至于具体采用什么锁则由数据库来设置。

串行化(SERIALIZABLE):所有事务都一个接一个地串行执行,这样可以避免幻读(phantom reads)。对于基于锁来实现并发控制的数据库来说,串行化要求在执行范围查询(如选取年龄在10到30之间的用户)的时候,需要获取范围锁(range lock)。如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需要滚回该事务。

可重复读(REPEATABLE READ):所有被Select获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况。但是却没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据,因为前一个事务没有范围锁。

读已提交(READ COMMITED):被读取的数据可以被其他事务修改。这样就可能导致不可重复读。也就是说,事务的读取数据的时候获取读锁,但是读完之后立即释放(不需要等到事务结束),而写锁则是事务提交之后才释放。释放读锁之后,就可能被其他事物修改数据。该等级也是SQL Server默认的隔离等级。

读未提交(READ UNCOMMITED):这是最低的隔离等级,允许其他事务看到没有提交的数据。这种等级会导致脏读(Dirty Read)。

不同隔离级别可能发生的并发问题:

隔离级别

更新丢失

脏读

不可重复读

幻读

Read Uncommitted

NO

YES

YES

YES

Read

Committed

NO

NO

YES

YES

Repeatable Read

NO

NO

NO

YES

Serializable

NO

NO

NO

NO

MYSQL中设置事务隔离的命令:

1.查看当前会话隔离级别

  select@@tx_isolation;

2.查看系统当前隔离级别

  select@@global.tx_isolation;

3.设置当前会话隔离级别

  setsessiontransactionisolatinlevelrepeatableread;

4.设置系统当前隔离级别

  setglobaltransactionisolationlevelrepeatableread;

5.设置自动提交

  set autocommit = 0/1; (0为不自动提交,1为自动提交)

Hibernate中的锁定模式:

Hibernate中使用LockMode类表示锁定,该类定义了6个常量表示6中不同的锁定模式:

在Hibernate中使用LockMode.UPGRADE或者LockMode.UPGRADE_NOWAIT模式表示使用悲观锁,这种悲观锁完全基于数据库的锁机制实现。

使用Query/Criteria对象的setLockMode()方法设置悲观锁

1 Session session = HibernateUtil.getSession(); 2Transaction ts = session.beginTransaction(); { 5Query query = session.createQuery(“from Family as f”); 6query.setLockMode(“f”, LockMode.UPGRADE); 7List<Family> list = query.list(); 8 ts.commit(); 9 }10catch (Exception e) {11if(ts != null && ts.isActive())12 ts.rollback();13 e.printStackTrace();14 }15finally {16 HibernateUtil.closeSession(session);17}将来靠自己双掌;愿你用双掌开拓出美好的梦想。

Hibernate_事务管理详解

相关文章:

你感兴趣的文章:

标签云: