深入浅出的Spring事务讲解
Spring事务,指的是它对数据库事务的支持。通过Spring我们可以使用编程式或者声明式的方式对数据库进行事务的操作。
事务使用方式
申明式:指的是通过AOP的方式进行事务,通过对方法使用 @Transactional注解声明,植入事务切面逻辑。
编程式:通过直接代码侵入的方式控制事务,例如:
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
try {
//do something
platformTransactionManager.commit(transactionStatus);
} catch (Exception e) {
platformTransactionManager.rollback(transactionStatus);
}
当然也可以使用TransactionTemplate事务模板进行编程式事务控制,代码会简单很多。
Spring事务实现
对于面向对象编程,抽象的类型和质量影响了编程的复杂度,事务这个抽象的概念又是如何进行抽象解剖呢?
接下来就从事务抽象的对象集开始,由点及面,由浅入深,引申出整个事务实现。
事物控制器
PlatformTransactionManager事物控制器是Spring事物管理核心接口,不管是声明式事物控制或编程式都要依赖此接口的实现,接口提供三个方法:
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
getTransaction(TransactionDefinition)
通过事务的定义获取事物状态对象,事务状态是什么?包括:事务定义相对应的数据库连接,是否可读,这些session级别的连接控制,封装成对象TransactionStatus,
说白了其实就是JDBC的获取连接。
DefaultTransactionStatus,其中包含最重要的也是贯穿整个事物阶段的数据库连接(connection)
TransactionDefinition
使用过@Transactional注解的同学,应该比较清楚,此注解中有些属性,包括:timeout(事物超时)、isolation(隔离级别)、propagation(传播属性)、rollbackFor(回滚异常)等。其中timeout、isolation用于数据库获取连接时的参数设置,而rollbackFor等是Spring控制事物属性,这些就是Spring的事务定义。
事物是抽象的概念,指的是不可分割的一系列操作,要么完全地执行,要么完全地不执行,也就是commit或rollback命令。
commit()
传递TransactionStatus提交事物,上面所说TransactionStatus拥有重要的属性,数据库连接对象,而最终的提交就是方法connection.commit()调用。
rollback()
和上面类似,connection.rollback()。