前言:
此时小伙伴们对“mysql事务失效”大体比较注重,姐妹们都想要分析一些“mysql事务失效”的相关文章。那么小编在网摘上网罗了一些关于“mysql事务失效””的相关文章,希望咱们能喜欢,姐妹们一起来了解一下吧!数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位
spring如何开启事务
正确代码实例:
@Servicepublic class ServiceImpl implements Service { @Transactional(rollbackFor = Exception.class) public void update(string xxxx) { // update logic }}以下几种情况会导致开启的事务失效1.数据库引擎不支持事务
mysql存储引擎除了innodb,其它都不支持事务
2.类没有被spring管理
比如上面的代码示例中的ServiceImpl类没有增加 @Service注解,这个类就不会被加载成一个bean,不会被spring管理,事务也就失效了
3.方法非public修饰
@Transactional只能用在public方法上面,原因是spring要求被代理的方法必须是public,否则事务不会生效。
4.方法中调用同类方法
@Servicepublic class ServiceImpl implements Service { public void test(string xxxx) { update(xxxx); } @Transactional(propagation = Propagation.REQUIRED) public void update(string xxxx) { // update logic }}
因为是AOP,直接调用内部方法并非是代理类调用
5.抛出的异常被捕获
@Servicepublic class ServiceImpl implements Service { @Transactional public void update(string xxxx) { try { // update logic } catch { } }}
异常被内部try catch 捕获,外部事务不会捕获异常,触发回滚
6.事务的传播机制配置错误
@Servicepublic class ServiceImpl implements Service { @Transactional(propagation = Propagation.NEVER) public void update(string xxxx) { try { // update logic } catch { } }}
spring事务传播机制说明可参考下述文章
Spring事务传播机制
7.rollbackFor属性设置错误
@Servicepublic class ServiceImpl implements Service { @Transactional(rollbackFor = NullPointerException.class) public void update(string xxxx) { // update logic }}
rollbackFor 用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。 默认是在RuntimeException和Error上回滚。 若异常非配置指定的异常类,则事务失效
8.noRollbackFor属性设置错误
和rollbackFor互补使用,用法相反
9.被final修饰的方法
@Servicepublic class ServiceImpl implements Service { @Transactional(rollbackFor = Exception.class) public final void update(string xxxx) { // update logic }}
final修饰的方法表明方法不能被子类重写 spring事务的底层是通过aop来创建一个代理类,而代理类无法重写该方法,无法实现事务功能。
标签: #mysql事务失效