一.事务管理
一个数据库事务是一个被视为单一的工作单元的操作序列。这些操作应该要么完整地执行,要么完全不执行。事务管理是一个重要组成部分,
四个属性ACID:
- 原子性:事务应该当作一个单独单元的操作,这意味着整个序列操作要么是成功,要么是失败的。
- 一致性:这表示数据库的引用完整性的一致性,表中唯一的主键等。
- 隔离性:可能同时处理很多有相同的数据集的事务,每个事务应该与其他事务隔离,以防止数据损坏。
- 持久性:一个事务一旦完成全部操作后,这个事务的结果必须是永久性的,不能因系统故障而从数据库中删除。
在Spring中的事务管理分两种:
- 支持编程式事务管理
- 声明式事务管理
二.区分几个概念:
1.局部事物 vs. 全局事务
局部事务是特定于一个单一的事务资源,入一JDBC连接,而全局事务可以跨多个事务资源事务,如在一个分布式系统中的事务。
局部事务管理在一个集中的计算环境中是有用的,该计算环境中应用组件和资源位于一个单位点,而事务管理只涉及到一个运行在一个单一机器中的本地数据管理器。局部事务更容易实现。
全局事务管理需要在分布式计算环境中,所有的资源都分布在多个系统中。在这种情况下 事务管理需要同时在局部和全局范围内进行。分布式或全局事务跨多个系统执行,它的执行需要全局事务管理系统和所有相关系统的局部数据管理人员之间的协调。
2.编程式 vs. 声明式
编程式事务管理:这意味着你在编程的帮助下有管理事务。这给了你极大的灵活性,但却很难维护
声明式事务管理:从业务代码中分离事务管理。仅仅使用注释或XML配置来管理事务。
声明式事务管理比编程式事务管理更可取,尽管它不如编程式事务管理灵活,但它允许你通过代码控制事务。但作为一种横切关注点,声明式事务管理可以使用 AOP 方法进行模块化。Spring 支持使用 Spring AOP 框架的声明式事务管理。
三.Spring事务抽象
1.Spring 事务抽象的关键是由 org.springframework.transaction.PlatformTransactionManager 接口定义
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition);
throws TransactionException;//返回活动事务或创建一个新事务
void commit(TransactionStatus status) throws TransactionException;//提交
void rollback(TransactionStatus status) throws TransactionException;//回滚
}
2.TransactionDefinition 是在 Spring 中事务支持的核心接口,它的定义如下:
public interface TransactionDefinition {
int getPropagationBehavior();//返回传播行为
int getIsolationLevel();//返回该事务独立于其他事务的工作程度
String getName();//返回事务的名称
int getTimeout();//返回以秒为单位的时间间隔,事务必须在该时间间隔内完成。
boolean isReadOnly();//返回该事务是否是只读的。
}
3.隔离级别:
1 | TransactionDefinition.ISOLATION_DEFAULT这是默认的隔离级别。 |
---|---|
2 | TransactionDefinition.ISOLATION_READ_COMMITTED 表明能够阻止误读;可以发生不可重复读和虚读。 |
3 | TransactionDefinition.ISOLATION_READ_UNCOMMITTED 表明可以发生误读、不可重复读和虚读。 |
4 | TransactionDefinition.ISOLATION_REPEATABLE_READ 表明能够阻止误读和不可重复读;可以发生虚读。 |
5 | TransactionDefinition.ISOLATION_SERIALIZABLE 表明能够阻止误读、不可重复读和虚读。 |
4.Spring支持的传播行为
|1 | TransactionDefinition.PROPAGATION_REQUIRED
支持当前事务;如果不存在事务,则创建一个新的事务。 |
---|
2 |
TransactionDefinition.PROPAGATION_REQUIRES_NEW 创建一个新事务,如果存在一个事务,则把当前事务挂起。 |
3 |
支持当前事务;如果不存在当前事务,则抛出一个异常。 |
4 |
如果存在当前事务,则在一个嵌套的事务中执行。 |
5 |
不支持当前事务;如果存在当前事务,则抛出一个异常。 |
6 |
不支持当前事务;而总是执行非事务性。 |
7 |
支持当前事务;如果不存在,则执行非事务性。 |
8 |
使用默认超时的底层事务系统,或者如果不支持超时则没有。 |
5.TransactionStatus 接口为事务代码提供了一个简单的方法来控制事务的执行和查询事务状态。
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction();//在当前事务是新的情况下,该方法返回 true。
boolean hasSavepoint();//该方法返回该事务内部是否有一个保存点,也就是说,基于一个保存点已经创建了嵌套事务。
void setRollbackOnly();//该方法设置该事务为 rollback-only 标记。
boolean isRollbackOnly();//该方法返回该事务是否已标记为 rollback-only。
boolean isCompleted();//该方法返回该事务是否完成,也就是说,它是否已经提交或回滚。
}