说我在Spring Boot应用程序中有以下Spring bean。我的意图是使foo()
具有事务性,以便:
barService.bar()
引发异常时,持久化将回滚。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'
答案 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()
。