不用@Transactional,事务管理在baseservice里怎么写
时间: 2023-10-19 07:07:13 浏览: 95
spring +springboot+mybatis+maven 读写分离及事务管理
3星 · 编辑精心推荐
如果不使用 @Transactional 注解进行事务管理,可以在 BaseServiceImpl 类中手动编写事务管理代码。具体实现方式如下:
1. 在 BaseServiceImpl 类中引入 org.springframework.transaction.PlatformTransactionManager 类型的成员变量,用于获取事务管理器。
2. 在 BaseServiceImpl 类中编写 beginTransaction() 方法,通过获取事务管理器,开启事务并返回 Transaction 类型的对象。
3. 在 BaseServiceImpl 类中编写 commit(Transaction tx) 和 rollback(Transaction tx) 方法,在 commit() 方法中提交事务,在 rollback() 方法中回滚事务。
4. 在需要进行事务管理的方法中,首先调用 beginTransaction() 方法获取 Transaction 对象,然后在方法执行过程中进行数据操作,最后根据操作结果调用 commit() 或 rollback() 方法提交事务或回滚事务。
下面是一个示例:
```
@Service
public class BaseServiceImpl implements BaseService {
@Autowired
private PlatformTransactionManager transactionManager;
public Transaction beginTransaction() {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
return transactionManager.getTransaction(def);
}
public void commit(Transaction tx) {
transactionManager.commit(tx);
}
public void rollback(Transaction tx) {
transactionManager.rollback(tx);
}
public void doSomeTransactionalOperation() {
Transaction transaction = beginTransaction();
try {
// do some data operations
commit(transaction);
} catch (Exception e) {
rollback(transaction);
}
}
}
```
在以上示例中,BaseServiceImpl 类中通过创建 TransactionDefinition 对象指定了事务的传播行为为 PROPAGATION_REQUIRED,这表示如果当前方法执行时已存在事务,则加入该事务并与该事务共用一条连接,如果当前方法执行时不存在事务,则创建一个新事务。
对于需要进行事务管理的方法,都可以通过调用 beginTransaction() 方法获取 Transaction 对象,并根据实际需求在方法执行完毕后提交事务或回滚事务。
阅读全文