2007-09-07

Hibernate学习笔记-Transaction Isolation

关键字: java transaction isolation

Transaction如果不隔绝,则在多个transactions访问数据库时容易产生如下问题:

1,Lost update - 两个transactions同时更新同一行,由于第2个transaction的abort,造成2个更新都失去。这一般发生在系统没有对transaction进行隔绝。

2,Dirty read - 一个transaction正在读取另一个还没有commited的transaction对数据库做的改变。如果第2个transaction roll back,那么第一个transaction读取的信息就是不同步的。

3,Unrepeatable read - 一个transaction对数据库中同一行数据读取了2遍,但是读取出来的数据却不同。这可能发生的情况是在这两次读取的间隔另一个transaction对该行做了更新。

4,Second lost updates problem - 这种问题是Unrepeatable read的一种特例。当2个transactions同时读取一行,其中一个对该行做了更新并且commited,此时另外一transaction可能也会对此行做更新。那么第一个transaction做的改变就失效了。

5,Phantom read - 一个transaction执行了2次同一个query,但是第2次query读出的结果集合有第一个不存在的行。这发生在在两次query执行之间另一个transaction新增了新行。

为了解决以上问题,引入了Transaction Isolation的概念,并且对Isolation做了分级。

ANSI SQL和JTA定义的Isolation Level是一致的,包括以下四种Level:

1,Read uncommitted - 允许Dirty Read但是不允许Lost update。即一个transaction在更新数据库的一行时,别的Transaction不能对其做写操作,只能做读操作。这是通过排它写锁实现的。

2,Read committed - 允许Unrepeatable reads但是不允许Dirty reads。对一行做读操作的transactions不会block其它访问改行的transaction,但是一个没有committed的对该行进行写操作的transaction会block掉其它的transaction(包括读操作的transaction)。这是通过排它写锁和瞬时的共享读锁实现的。

3,Repeatable Read - 在此level下,只有Phantom read可能发生。当一个transaction对数据库进行读操作时候,它会block掉其它全部的transactions(不包括只读的transactions),而一个对数据库进行写操作的transaction就会block掉其它全部的transactions。这是通过排它写锁和共享读锁实现的。

4,Serializable - 这是最严格的Isolation level。他让全部的transactions以线性的方式依次执行。这是通过排它锁实现的。

Hibernate中设置隔绝类型的方法:

在cfg里面修改hibernate.connection.isolation属性。相关可选属性:
1—Read uncommitted isolation
2—Read committed isolation
4—Repeatable read isolation
8—Serializable isolation

 

评论
发表评论

您还没有登录,请登录后发表评论

cjyzpcl
搜索本博客
最近加入圈子
存档
最新评论