事务隔离级别

    分布式环境中的事务可能有不同的隔离级别,可以以编程的方式设置它们。这些并发的事务彼此联系的程度是用事务隔离级别设置的。Java.sql.Connection 接口确定了 5 个用整数常量定义的隔离级别。隔离级别是为解决由 ANSI/ISO 92 标准所定义的特定的数据不一致性情况而设计的。

脏读
  当事务可以在另一个事务提交之前读取受这个事务影响的数据时会发生脏读(dirty read)。
  例如,假定有一个预订系统,可以显示剧场中的所有座位。X 先生预订了 4 个座位并用信用卡付钱。
  这时 Y 先生希望买同样的 4 个座位,但是它们显示为已订出。这时,信用卡验证拒绝了事务,座位又空了。这种情况是可接受的,所以在这种系统中允许脏读。

不可重复读
  当事务试图两次选择同一行、但是在这期间第二个事务已经修改或者删除了这行时。就会出现不可重复读。
  这种情况可能会导致第一个事务的不可预测或者不正确的结果。在一个拍卖网站,一个买家看到最后一次投标是 5 元。
  另一位买家出价 10 元并提交。第一位买家出价 6 元,但是这次投标马上就被拒绝了,因为系统中已经有了更高的投标了。
  在第二个事务中,我们检查上一次投标并得到新值,尽管事务还没提交。在同一个事务中有两个查询,得到两个不同的结果。
  这种情况可能在其他系统中产生麻烦,但是在投标系统中这是必要的。这与脏读不同,因为买方不能看到没有完成(提交)的任何投标。

幻读
      当事务读取满足某个标准的所有行、但是第二个事务插入了满足同一标准的新行时会出现幻读(phantom read)。
  如果第一个事务重新读取这些行,新的幻行就会出现在结果中。

      在一个在线书店中。一位客户按主题搜索图书。
  同时,一位雇员用新的书更新图书数据库。雇员输入了这本书的 ISBN 和它的数量,但没有提交(还输入另一本书)。
  这本书出现在客户的搜索结果中,这种情况是所希望的,我们希望客户可以尽快地订购这本书。
  稍后,雇员看到他输错了 ISBN,所以他从数据库中删除了这本书,客户再也看不到它了。
  这与脏读和不可重复读不同,因为添加了记录而不是修改了记录。客户在事务结束之前看不到修改的记录。
  
TRANSACTION_READ_UNCOMMITTED
      TRANSACTION_READ_UNCOMMITTED 属性使事务可以读取未提交的数据。这是最低级别的隔离(即与其他事务的隔离最少)。
      尽管这对于任务关键的应用程序是不可接受的,但是对于频繁读取、很少更新的组件却是一种好的选择。
      数据完整性的代价换来的是高薪能和低干扰。它有不可重复读、幻读和脏读的问题。
  
TRANSACTION_READ_COMMITTED
      TRANSACTION_READ_COMMITTED 属性提供了次低的事务隔离级别。它不允许事务读取未提交的数据,但是允许不可重复读以及幻读。
  
TRANSACTION_REPEATABLE_READ
      TRANSACTION_REPEATABLE_READ 属性提供了第三级事务隔离级别。它不允许读取未提交或更新的数据,但是允许添加行-----幻读。

TRANSACTION_SERIALIZABLE
      TRANSACTION_SERIALIZABLE 属性提供最高级别的事务隔离。当第一个事务运行时,其他事务的所有修改都不允许发生。
      事务运行在真空中,与所有外部事务绝缘。经管在数据完整性非常重要时这可能很好,但是高的开销对性能有负面影响。
      要注意的重要一点是不是所有数据库都支持序列化事务,Oracle 就是这样的一个例子。
      需要序列化行为的场合的一个例子:想象汽车零售商的一个存储汽车系统。有人想买一辆汽车。
      当这个人观看汽车说明时,没人可以改变价格(没有脏读或者不可重复读)。也没有人可以向以前的拥有着的列表中添加商品(没有幻读)。
      在当前事务完成之前。我们不希望看到其他人修改、添加或者删除数据。

隔离级别                                            脏读    不可重复读   幻读
TRANSACTION_READ_UNCOMMITTED   是         是              是
TRANSACTION_READ_COMMITTED       否         是              是
TRANSACTION_REPEATABLE_READ      否         否              是
TRANSACTION_SERIALIZABLE              否         否              否


转载于:https://my.oschina.net/wellben/blog/121810

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值