spring中@Transactional注解失效

@Transactional注解失效

1、看数据库表的引擎是否支持事务

对于MySQL数据库,常用的引擎有MYISAM和InnoDB,但MYISAM引擎不支持事务操作,InnoDB引擎才支持事务操作,所以可以先查看表的引擎是否支持事务。

2、看是否对发生的异常进行了捕获

@Service
@Transactional
public class UserService {
    @Autowired
    private UserDao userDao;

    public void transferMoney(){
        try {
            userDao.decrOne();
            int a = 10/0;
            userDao.incrOne();
        }catch (ArithmeticException e) {
            e.printStackTrace();
        }
    }
}

此时异常已经被捕获,所以事务不会生效

@Service
@Transactional
public class UserService {
    @Autowired
    private UserDao userDao;

    public void transferMoney(){
        try {
            userDao.decrOne();
            int a = 10/0;
            userDao.incrOne();
        }catch (NullPointerException e) {
            e.printStackTrace();
        }
    }
}

由于此时发生的异常为ArithmeticException,但是捕获的异常为NullPointerException,所以此时事务是会生效并且回滚。

如果是在service层抛出异常,而在调用service的方法上(如controller层)捕获了异常,则事务仍然能够回滚

3、看是否开启了事务注解

<!--创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="datasource"/>
</bean>

<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

4、看方法的访问修饰符是不是public

@Transactional注解只能对可见度为public的方法有效,如果使用protected等修饰符,事务不会起作用。

@Service
@Transactional
public class UserService {
    @Autowired
    private UserDao userDao;
	//访问修饰符为protected,注解不生效
    protected void transferMoney(){
        userDao.decrOne();
        int a = 10/0;
        userDao.incrOne();
    }
}

5、看是否被未注解的方法调用

@Service
public class UserService {
   @Autowired
   private UserDao userDao;

   @Transactional
   public void transferMoney(){
       userDao.decrOne();
       int a = 10/0;
       userDao.incrOne();
   }

   public void test() {
       transferMoney();
   }
}

test方法没有@transactional注解,此时调用transferMoney方法,则transferMoney方法发生异常之后不会回滚。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值