`

事务隔离性与传播性概述

 
阅读更多

什么是事务?
从四个关键概念谈起:
原子性 – 所有操作要么都成功,要么都失败
一致性 – 事务不能违反完整性约束(比如虽然事务还未提交,但仍需遵守各种约束规则,这些规则是在事务提交之前而非在事务提交以后才生效!)
隔离性 – 一个事务的效果,不影响正在同时执行的其它事务,那么,不影响的程度如何呢?这个由隔离级别来定义,标准的隔离级别有下列四种:
          未提交读(read uncommitted)
          提交读(read committed)
          重复读(repeatable read)
          序列化(serializable)
通过一些现象可看出隔离级别的效果:
脏读 – (dirty read) 当一个事务读取另一个事务尚未提交的修改时,产生脏读。
不可重复读 – (nonrepeatable read) 同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。
幻读 – (phantom read) 同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。
Dirty Read  NonRepeatable Read  Phantom Read 
Read uncommitted Possible Possible Possible
Read committed Not possible Possible Possible
Repeatable read Not possible Not possible Possible
Serializable Not possible Not possible Not possible

持久性 – 一旦事务成功完成,则数据必需保证已经正确的持久化(保存)!

JDBC事务与JTA事务
JDBC事务只能支持一个数据库(单数据源),而JTA可以支持分布式的事务(多数据源)。
 JDBC事务,一般由数据库本身来执行提交或回滚操作(单阶段提交)。所有数据库都有它自己的事务管理器,这些管理器只能处理其自身的事务(称为本地事务)。
 而JTA则不同,JTA要支持多个数据源,站在更高的角度上,提供一个“事务处理监视器(TPM)”来管理和协调这些数据源之间的事务操作。它必需执行两阶段提交(2PC)协议。
 准备阶段 – TPM向所有RM(资源管理器,即数据库)确认状态,是否可以提交或回滚
 提交阶段 – TPM确认提交之后,向所有RM发出提交指令(或回滚)
 TPM本身会维护事务日志,以保证持久性(灾难恢复等)

传播特性
Not Supported – 不支持,如果当前有事务上下文,将挂起当前的事务
Supports - 支持,如果有事务,将使用事务,如果没有事务,将不使用事务
Required - 需要,如果当前有事务上下文,将使用当前的上下文事务,如果没有,将创建新的事务
Required New - 需要新的事务,如果当前有事务上下文,将挂起当前的事务,并创建新的事务去执行任务,执行完成之后,再恢复原来的事务
Mandatory - 当前必须要有事务上下文,如果当前没有事务,将抛出异常
Never - 当前必须不能有事务上下文,如果有事务,将抛出异常

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics