事务的基本概念

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

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

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

猜你喜欢

转载自mychao.iteye.com/blog/2087614