如何从服务 class 回滚事务?
How to rollback transaction from service class?
我正在尝试通过抛出异常来回滚某些情况。但我找不到合适的方法来做到这一点。这是我的服务 class
@Service
public class UserManager implements IUserManager {
private final IBasicEM basicEM;
public ApplicantInfoManager(IBasicEM basicEM) {
this.basicEM = basicEM;
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public boolean purgeUser(Long id) throws Exception {
//business logic
basicEM.Update(entity)
if(//condition) {
throw New RollBackException("//message")
}
//business logic
}
}
这是我的 BasicEM
class
@Component
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
public class BasicEM {
@PersistenceContext(unitName = "db1")
private EntityManager em;
public void update(Object target) {
em.merge(target);
}
}
所以我想要的是调用 update
方法,然后如果条件为真,则撤消更新。
我的意图是当我抛出异常时,事务结束并且不提交更新。但我错了,更新已经完成了。请帮助我实现我的目标。
为了实现您想要的效果,您需要在 Service 方法中已有一个事务。 @Transactional(value = "transactionManager", rollbackFor = Exception.class)
的默认传播类型是 Propagation.REQUIRED
,这意味着如果您的服务已包含在事务中,则 basicEM.Update(entity)
也将包含在该事务中。
@Service
public class UserManager implements IUserManager {
private final IBasicEM basicEM;
public ApplicantInfoManager(IBasicEM basicEM) {
this.basicEM = basicEM;
}
@Override
@Transactional(value = "transactionManager",
propagation = Propagation.REQUIRES_NEW, rollbackFor = RollBackException.class)
public boolean purgeUser(Long id) throws Exception {
//business logic
basicEM.Update(entity)
if(//condition) {
throw New RollBackException("//message")
}
//business logic
}
}
如果 RollBackException
是 RuntimeException
,则您无需明确配置事务在抛出时应回滚。如果不是,则需要配置如下:@Transactional(value = "transactionManager", propagation = Propagation.REQUIRES_NEW, rollbackFor = RollBackException.class)
.
我正在尝试通过抛出异常来回滚某些情况。但我找不到合适的方法来做到这一点。这是我的服务 class
@Service
public class UserManager implements IUserManager {
private final IBasicEM basicEM;
public ApplicantInfoManager(IBasicEM basicEM) {
this.basicEM = basicEM;
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public boolean purgeUser(Long id) throws Exception {
//business logic
basicEM.Update(entity)
if(//condition) {
throw New RollBackException("//message")
}
//business logic
}
}
这是我的 BasicEM
class
@Component
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
public class BasicEM {
@PersistenceContext(unitName = "db1")
private EntityManager em;
public void update(Object target) {
em.merge(target);
}
}
所以我想要的是调用 update
方法,然后如果条件为真,则撤消更新。
我的意图是当我抛出异常时,事务结束并且不提交更新。但我错了,更新已经完成了。请帮助我实现我的目标。
为了实现您想要的效果,您需要在 Service 方法中已有一个事务。 @Transactional(value = "transactionManager", rollbackFor = Exception.class)
的默认传播类型是 Propagation.REQUIRED
,这意味着如果您的服务已包含在事务中,则 basicEM.Update(entity)
也将包含在该事务中。
@Service
public class UserManager implements IUserManager {
private final IBasicEM basicEM;
public ApplicantInfoManager(IBasicEM basicEM) {
this.basicEM = basicEM;
}
@Override
@Transactional(value = "transactionManager",
propagation = Propagation.REQUIRES_NEW, rollbackFor = RollBackException.class)
public boolean purgeUser(Long id) throws Exception {
//business logic
basicEM.Update(entity)
if(//condition) {
throw New RollBackException("//message")
}
//business logic
}
}
如果 RollBackException
是 RuntimeException
,则您无需明确配置事务在抛出时应回滚。如果不是,则需要配置如下:@Transactional(value = "transactionManager", propagation = Propagation.REQUIRES_NEW, rollbackFor = RollBackException.class)
.