我在使用@Transactional注释进行事务回滚时遇到问题。
我在backingbean,service和dao类中有以下方法:
public class ItemBackingBean {
public void saveUpdate() {
try {
ItemService.executeTransaction();
}
catch(Exception e) {
}
}
}
public class ItemService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void executeTransaction() {
deleteItem();
createOrder();
}
private void deleteItem() {
persist();
}
private void createOrder() {
persist();
}
private void persist() {
JpaDaoImpl.persist(object);
JpaDaoImpl.update(object);
}
}
public class JpaDaoImpl implements JpaDao {
@Transactional(readOnly = true)
public persist(Object object) {
getEm().persist(object);
}
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void update(Object object) {
getEm().merge(object);
}
@Transactional(readOnly = true)
public void remove(Object object) {
getEm().remove(object);
}
}
如果createOrder()中发生任何异常,则所有事务都应该回滚但不会发生。任何人都可以告诉我这个问题吗?
@Transactional在JpaDaoImpl.java中有什么影响? persist()和update()方法具有不同的radOnly值。这个Dao是我们项目中的现有代码,我们不想改变它。有人可以帮忙吗?
此致 Bandu
答案 0 :(得分:0)
对于那些不想抛出异常的人(不应该仅在异常发生时才回滚事务),请使用以下命令:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
答案 1 :(得分:-1)
如果createOrder()中发生任何异常,则所有事务都应该回滚但不会发生。任何人都可以告诉我这个问题吗?
仅针对RuntimeExceptions进行回滚(请参阅http://docs.spring.io/spring/docs/2.0.8/reference/transaction.html"请注意,默认情况下,Spring Framework的事务基础结构代码仅在运行时标记事务以进行回滚,未经检查例外;")但它是一种可自定义的行为
如果您想要一个ALL或NOTHING行为,您可以保持PROPAGATION_REQUIRED的默认事务传播而不影响现有代码