Spring中的事务管理

目录

事务的特性

Spring事务管理的核心接口

PlatformTransactionManager

TransactionStatus事务状态

TransactionDefinition基本事务属性的定义

传播行为

隔离级别

只读

事务超时

回滚规则

Spring的声明式事务和编程式事务


Spring不直接管理事务,而是提供了很多事务管理器。Spring的事务管理器接口为是org.springframework.transaction.PlatformTransactionManager。通过这个接口,Spring为各个平台提供了事务管理器,但具体实现由平台去实现。比如为JDBC、Hibernate等都提供了对应的事务管理器。

事务的特性

ACID

Spring事务管理的核心接口

Spring中的事务管理

PlatformTransactionManager

Spring中的事务管理

TransactionStatus事务状态

PlatformTransactionManager的getTransaction方法返回的是事务的状态TransactionStatus,程序根据返回的状态,进行相应的操作。

Spring中的事务管理

TransactionDefinition基本事务属性的定义

事务属性可以理解为事务的一些基本配置,描述了事务策略如何应用到方法上。包含了5个方面。

Spring中的事务管理

Spring中的事务管理Spring中的事务管理

传播行为

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。

PROPAGATION_REQUIRED:当前事务有事务就是用当前事务,没有就创建一个新的事务。

PROPAGATION_SUPPORTS当前事务有事务就是用当前事务,没有就以非事务执行。

PROPAGATION_MANDATORY:当前事务一定要有事务,否则就抛异常。

PROPAGATION_REQUIRES_NEW:无论是否有事务,都创建一个新的事务。

PROPAGATION_NOT_SUPPORTED:不支持事务,按非事务方式运行。

PROPAGATION_NEVER:不支持事务,如果有事务则抛异常。

PROPAGATION_NESTED:嵌套,当前有事务就在当前事务里再起一个事务。

隔离级别

int ISOLATION_DEFAULT = -1; 使用数据库默认的隔离级别

int ISOLATION_READ_UNCOMMITTED = 1; 未提交读

int ISOLATION_READ_COMMITTED = 2; 提交读

int ISOLATION_REPEATABLE_READ = 4; 可重复读

int ISOLATION_SERIALIZABLE = 8;串行化

只读

boolean isReadOnly();

这是事务的第三个特性,是否为只读事务。如果事务只对后端的数据库进行该操作,数据库可以利用事务的只读特性来进行一些特定的优化。通过将事务设置为只读,你就可以给数据库一个机会,让它应用它认为合适的优化措施。

事务超时

int TIMEOUT_DEFAULT = -1;

为了使应用程序很好地运行,事务不能运行太长的时间。因为事务可能涉及对后端数据库的锁定,所以长时间的事务会不必要的占用数据库资源。事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束。

回滚规则

事务五边形的最后一个方面是一组规则,这些规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚(这一行为与EJB的回滚行为是一致的) 。但是你可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样,你还可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。

Spring的声明式事务和编程式事务

编程式事务:通过代码的方式实现事务,允许用户在代码中精确定义事务的边界。即类似于JDBC编程实现事务管理。管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

声明式事务:事务管理建立在AOP之上。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。将事务管理和业务逻辑分离开来,方便管理。

一个使用 MyBatis-Spring 的其中一个主要原因是它允许 MyBatis 参与到 Spring 的事务管理中。它可以使用spring的事务管理,可以将数据库操作的异常转化为DataAccessException。