本篇博客将各位介绍事务的相关内容,也算是对事物的大部分知识点进行的一个总结,接下来就跟着我一起来学习学习吧~
实现事务
实现事务的方式大类共有两大类,一种是编程式事务,另一种是声明式事务。
编程式事务的好处在于他的最小事务粒度可以达到某个代码块上,且可以根据具体的业务逻辑进行调整;但是坏处在于事务的代码实现和业务逻辑混合在一块,这样在管理业务代码和事务代码上就有了很强的耦合性,不方便管理。
声明式事务好处在于主要是通过aop的方式实现的,在方法上加上注解就可以在方法开始之前开启事务,在方法结束后选择提交事务或者是回滚事务,这样将业务逻辑和事务代码相隔开来更容易管理,实现了非侵入式管理;但是缺点也显而易见, 那就是事务的最小粒度为一个方法,无法做到一个代码块上。
那接下来就看看这两类实现事务的方式是如何实现的吧~
编程式事务
这类实现事务的方式主要是通过两种方式实现的,一种是通过PlatformTransactionManager,另一种是通过TransactionTemplate,我们先来看代码:
@Service
public class userService {
@Autowired
private PlatformTransactionManager platformTransactionManager;
@Autowired
private TransactionTemplate transactionTemplate;
public void usePlatfofrmTransaction() {
// 定义默认的事务属性
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
TransactionStatus status = platformTransactionManager.getTransaction(transactionDefinition);
try {
//业务逻辑
// ....
platformTransactionManager.commit(status);
} catch (Exception e) {
platformTransactionManager.rollback(status);
e.printStackTrace();
}
}
public void useTransactionTemplate() {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
//业务逻辑
}catch (Exception e){
status.setRollbackOnly();
e.printStackTrace();
}
}
});
}
}
这两种都可以实现事务,但是各有千秋,比较推荐使用TransactionTemplate这种来实现。
对于这种有两个内部类实现:
第一种无返回值,第二种有返回值,根据具体业务代码进行选择。
声明式事务
这类事务实现方式主要就是通过@Transaction注解来实现的,我们又知道注解大部分有事通过aop的方式进行实现的,所以我们就可以在aop中来定义我们具体的事务处理。
因为这个使我们经常处理事务的方式,所以我们这里再来说一下事务的ACID性质,以及spring事务是如何进行处理的。
首先,这里还是简单说一下什么是事务的ACID性质: