在平常的工作会这样写一个模板事务,使用PlatformTransactionManager.getTransaction
创建并开启一个事务;
在try{}catch{}finally{}
块中处理事务的提交、异常回滚等。
示例代码:
@Service
public class demo{
@Resource()
PlatformTransactionManager transactionManager;
public int insert(Product product,ProdutExt ext){
TransactionStatus ts = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
//TODO 数据库操作
transactionManager.commit(ts);
}catch(Exception e){
//异常时回滚
transactionManager.rollback(ts);
throw e;
}finally {
//如果事务没有处理,默认进行回滚
if (!ts.isCompleted()) {
transactionManager.rollback(ts);
}
}
}
}
思前思后,一层一层扒下它的外纱,一层一层的看PlatformTransactionManager
是如何管理事务的开启、提交与回滚的。
前述
在Spring-TX
模块中有三个重要的接口:
PlatformTransactionManager 事务管理器
TransactionStatus 事务状态
TransactionDefinition 事务定义
各类之间的类图:
PlatformTransactionManager
用于整个事务的创建、开启、提交、回滚操作;事务的定义由TransactionDefinition
定义事务的隔离级别;TransactionStatus
用于对新创建的事务进行管理。
PlatformTransactionManager 事务管理器
PlatformTransactionManager
继承自TransactionManager
接口,TransactionManager
接口的作用只是用于标示类,没有任务的接口方法与字段;AbstractPlatformTransactionManager
对PlatformTransactionManager
进行了抽象,对方法进行了具体的实现;下面我们来看看源代码是什么样的吧。
PlatformTransactionManager
interface源代码:
public interface PlatformTransactionManager extends TransactionManager {
//1.创建一个事务并开启事务
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
//2.提交事务
void commit(TransactionStatus status) throws TransactionException;
//3.回滚事务
void rollback(TransactionStatus status) throws TransactionException;
}
如果实现getTransaction()
使用JDBC将如果开启一个事务呢?
//创建一个连接
JdbcConnection connection = ConnectionImpl.getInstance