1、简介
通常在开发中,我们都会直接使用Spring提供的@Transactional
注解来管理事务。但是在某些特殊的情况下,需要我们进行手动的事务管理。例如:将数据保存到数据库后,才能发送消息到队列中的这种情况。
Spring Data JPA中提供的方法的默认实现都自带@Transactional
注解,例如SimpleJpaRepository
中的实现。这就意味着,即使我们不显示的标注@Transactional
,也会自动的添加事务。
@Repository
// 默认添加只读事务
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
...
// DML操作添加读写事务
@Transactional
@Override
public <S extends T> S save(S entity) {
...
}
...
}
2、实现原理
那么怎样在 Spring Data JPA 中手动的管理事务呢?
这里主要用到Spring提供的三个事务相关的接口:
PlatformTransactionManager
事务管理器,定义了对事务的基本操作
public interface PlatformTransactionManager extends TransactionManager {
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
TransactionDefinition
事务定义接口,定义事务的基本信息,如传播行为、隔离级别、超时时间等。默认实现为DefaultTransactionDefinition
。<