springboot事务处理-转载
转载地址 http://blog.csdn.net/tianyaleixiaowu/article/details/73123242
版权声明:本文为博主武伟峰原创文章,转载请注明地址http://blog.csdn.net/tianyaleixiaowu。 http://blog.csdn.net/tianyaleixiaowu/article/details/73123242
在SpringBoot中使用事务很简单,这一篇不是为了讲事务,主要是讲一下一个工具类,将需要加入事务的Service层代码作为参数传递出去并返回事务的执行结果(成功和回滚)。
声明式事务
在SpringBoot中声明式事务最常见,就是把需要事务的方法用@Transactional标注一下就行了,这个一般用在Service层。标注后该方法就具备了事务的能力,出错了会自动回滚。
在大部分场景下,该方法已经够用了。
编程式事务
在有些场景下,我们需要获取事务的状态,是执行成功了还是失败回滚了,那么使用声明式事务就不够用了,需要编程式事务。
在SpringBoot中,可以使用两种编程式事务。
一个是TransactionTemplate
看名字就知道,又是一个类似于RedisTemplate的模板类。使用很简单,是一个回调。
- transactionTemplate.execute(new TransactionCallback() {
- @Override
- public Object doInTransaction(TransactionStatus transactionStatus) {
- try {
- userRepository.save(user);
- for (int i = 0; i < 10; i++) {
- Post post = new Post();
- if (i == 5) {
- post.setContent("dddddddddddddddddddddddddddddddddddddddddddd");
- } else
- post.setContent("post" + i);
- post.setWeight(i);
- postService.save(post);
- }
- } catch (Exception e) {
- transactionStatus.isRollbackOnly();
- e.printStackTrace();
- }
- return null;
- }
- });
二是TransactionManager
- TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
- try {
- for (int i = 0; i < 10; i++) {
- Post post = new Post();
- if (i == 5) {
- post.setContent("dddddddddddddddddddddddddddddddddddddddddddd");
- } else
- post.setContent("post" + i);
- post.setWeight(i);
- postService.save(post);
- }
- transactionManager.commit(status);
- } catch (Exception e) {
- transactionManager.rollback(status);
- e.printStackTrace();
- }
我们就基于这种方法来做一个工具类。这个工具类作用是接收一个Service层需要被事务包围的方法为参数,然后给调用端返回事务结果,供调用端根据结果做相应的处理。
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
- import org.springframework.transaction.PlatformTransactionManager;
- import org.springframework.transaction.TransactionStatus;
- import org.springframework.transaction.support.DefaultTransactionDefinition;
- import java.util.function.Consumer;
- /**
- * Created by admin on 17/6/12.
- */
- @Component
- public class TransactionUtil {
- @Autowired
- private PlatformTransactionManager transactionManager;
- public boolean transact(Consumer consumer) {
- TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
- try {
- consumer.accept(null);
- transactionManager.commit(status);
- return true;
- } catch (Exception e) {
- transactionManager.rollback(status);
- e.printStackTrace();
- return false;
- }
- }
- }
Service举例:
- @Service
- public class TestService {
- /**
- * 此处不需要事务,由Transaction控制事务
- */
- public void doSome(int i) {
- System.out.println("我是Service层" + i);
- }
- }
boolean result = transactionUtil.transact(s -> testService.doSome(1))来获取事务的执行结果了。
该工具是需要获取事务执行结果的封装。
浙公网安备 33010602011771号