如何在Spring Boot服务中声明`@ Transactional`,以便“立即”引发异常?

时间:2019-05-09 02:14:17

标签: spring hibernate spring-boot spring-data-jpa spring-transactions

说我在Spring Boot应用程序中有以下Spring bean。我的意图是使foo()具有事务性,以便:

  1. barService.bar()引发异常时,持久化将回滚。
  2. 当persist引发异常时,该异常会立即传播到调用方,因此不会调用 barService.bar()
@Service
public class FooService
{
    @Autowired
    private FooRepository fooRepository;
    @Autowired
    private BarService barService;

    @Transactional
    public void createFoo(Foo foo) {
        fooRepository.save(foo);
        // expect to not execute when the above line throws exceptions
        barService.bar();
    }
}

@Service
public class BarService {
    public void bar() {

    }
}

到目前为止,第一个要求有效,但是第二个要求无效。当持久抛出异常时, barService.bar()总是被称为

如果我删除了@Transactional,则第二项要求有效,而第一项则无效。

我还尝试了所有Propagation类型,但它们都没有按我预期的那样工作。例如,如果我使用@Transactional(MANDATORY),则会出现以下错误:

org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'

1 个答案:

答案 0 :(得分:3)

在没有$( document ).ready(function() { $('#bootstrap_css_link).click(function () { var newArray function clip(clip_id){ var clipboard = new ClipboardJS(clip_id); clipboard.on('success', function(e) { setTooltip(e.trigger, 'Copied!'); hideTooltip(e.trigger); //alert("hello"); }); } }); }); 的情况下,对repo方法的每次调用都是一个独立的事务,它将立即被刷新。这就是为什么您的第二个要求在没有@Transactional的情况下工作的原因。

添加@Transactional时,整个@Transactional成为一个交易单位。因此,仅在createFoo()执行完毕时才刷新您在调用save()时所做的更改。这就是为什么您的第一个要求可以与createFoo()一起使用的原因。

要实现所需的功能,请保留@Transactional并致电@Transactional而不是saveAndFlush()