记录一次@Transactional注解生效,日志显示回滚但是数据库仍然执行的问题

在网上查了很多@Transactional注解不起作用的问题,但都没有解决问题,
然后找了好久找到一个很棒的解决方案
原文章链接
大概意思就是mysql默认的操作模式就是autocommit,每个操作都会被当作一个独立的事务,因此才会日志显示回滚,同时可以在mysql中输入

select @@autocommit;

通过上述命令可以查看数据库是否是自动提交sql语句的

按照链接文章的方式修改c3p0的配置文件如下

对应包下的类如下:

public class MyConnectionCustomizer extends AbstractConnectionCustomizer {
    @Override
    public void onCheckOut(Connection c, String parentDataSourceIdentityToken) throws Exception {
        super.onCheckOut(c, parentDataSourceIdentityToken);
        c.setAutoCommit(false);
    }
}

本以为问题可以解决,可还是出现了问题,倒是可以回滚操作了,但是如果程序没有错误,如下图所示:
记录一次@Transactional注解生效,日志显示回滚但是数据库仍然执行的问题_第1张图片
显示commit了事务,但是实际上数据库根本没有修改两条数据,经过不断的回看日志信息,终于发现了一个隐患的地方,如下图所示
记录一次@Transactional注解生效,日志显示回滚但是数据库仍然执行的问题_第2张图片
trace有查找、找到的意思,一个事务里面有两个从数据库连接池中查找数据源的操作,再分析日志信息如下:
记录一次@Transactional注解生效,日志显示回滚但是数据库仍然执行的问题_第3张图片
发现事务回滚的是第一个数据源,而执行insert语句的是第二个数据源,因此联想到是不是配置事务数据源的地方是不是错了,回看spring-service.xml和spring-dao.xml文件
记录一次@Transactional注解生效,日志显示回滚但是数据库仍然执行的问题_第4张图片
发现其实项目里用的是动态数据源,而事务管理器使用的是mysql数据源,因此才会出现一个事务里查找了数据库连接池两次的情况,因此将事务管理器的数据源换成动态数据源,果然事务的回滚成功了,新的日志信息如下
记录一次@Transactional注解生效,日志显示回滚但是数据库仍然执行的问题_第5张图片
一个事务中只使用了一个数据源,数据回滚肯定成功了!!!真的想吐槽一下卧槽。

你可能感兴趣的:(spring事务)