关于我出现问题所在:
# 首先是在Dao中
@Modifying
@Query(value = "delete from user_role where uid in (SELECT uid from user_info where username = ?1)", nativeQuery = true)
Integer deleterUserRoleTableByName(String roleName);
# test(springboot 已经注入)
Integer integer = userInfoDao.deleterUserRoleTableByName("1");
System.out.println("integer = " + integer);
出现错误:
问题:没有添加十五回滚,简单的可以注解
@Modifying
@Transactional(rollbackFor = Exception.class)
@Query(value = "delete from user_role where uid in (SELECT uid from user_info where username = ?1)", nativeQuery = true)
Integer deleterUserRoleTableByName(String roleName);
结果:
好的,问题解决,现在是拓展笔记
-----------------------------------------------------------
上面因为我使用的是jpa方式,就是说DAO不需要实现,可以直接接口,如下图:
所以只考虑注解,但是开发中好像事物回滚通常是在service中处理,这样子,上面的方法拉到service也是可以使用,并且,还可以有别的方式,就是以前的方式。
以下方式学源于:https://blog.csdn.net/weixin_44299027/article/details/95231808
常用的三种注解
解决方案之一:在此方法@Transactional注解后面加上(rollbackFor = Exception.class)
解解决方案之二:@Transactional注解上不加rollbackFor这个属性,在try...catch...的catch里写上如何回滚。
下面代码的三种方案都是正确的(第一种是在类级别的注解上,第二种是在方法级别的注解上,第三种是在捕获异常后在catch里写上)
事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。
Positive example 1:
@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
@Override
public void save(User user) {
//some code
//db operation
}
}
Positive example 2:
@Service
public class UserServiceImpl implements UserService {
@Override
@Transactional(rollbackFor = Exception.class)
public void save(User user) {
//some code
//db operation
}
}
Positive example 3:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private DataSourceTransactionManager transactionManager;
@Override
@Transactional
public void save(User user) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// explicitly setting the transaction name is something that can only be done programmatically
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);
try {
// execute your business logic here
//db operation
} catch (Exception ex) {
transactionManager.rollback(status);
throw ex;
}
}
}
解释上述原因:
Spring框架的事务处理代码默认地 只 在抛出运行时和unchecked exceptions时才标识事务回滚。 也就是说,当抛出个RuntimeException 或其子类的实例时,(Errors 也一样 - 默认地 - 标识事务回滚。)从事务方法中抛出的Checked exceptions将 不 被标识进行事务回滚。
1、让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2、让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3、不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意: 如果异常被try{...}catch{...}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{...}catch{throw Exception}。