提问者:小点点

使用MySQL和Maria的Spring Boot JDBCTemboardDB提交和回滚问题


我使用带有JDBCTemplate的Spring Boot框架进行数据库访问。我使用Transactional注释来强制执行DB调用的事务。

@Transactional(rollbackFor = IllegalStateException.class, propagation = Propagation.REQUIRES_NEW)

使用MariaDB,我可以在下面看到事务序列和事务回滚的日志,并且没有提交任何内容。

o.s.j.d.DataSourceTransactionManager     : Creating new transaction with name [Test]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT,-java.lang.IllegalStateException
o.s.j.d.DataSourceTransactionManager     : Acquired Connection [HikariProxyConnection@368558459 wrapping org.mariadb.jdbc.MariaDbConnection@3e839aa3] for JDBC transaction
o.s.jdbc.core.JdbcTemplate               : Executing SQL statement [INSERT INTO test (Col1,Col2) values(1,'ABC')]
o.s.j.d.DataSourceTransactionManager     : Initiating transaction rollback
o.s.j.d.DataSourceTransactionManager     : Rolling back JDBC transaction on Connection [HikariProxyConnection@368558459 wrapping org.mariadb.jdbc.MariaDbConnection@3e839aa3]
o.s.j.d.DataSourceTransactionManager     : Releasing JDBC Connection [HikariProxyConnection@368558459 wrapping org.mariadb.jdbc.MariaDbConnection@3e839aa3] after transaction

但是,对于MySQl 5.1数据库,我可以在日志中看到事务被回滚,但仍提交DB更改。

在Debug模式下,当我抛出显式Checked Exception并定义时,我能够看到JDBC模板。执行调用发生记录提交和trscationManager收到回滚通知的时刻。

为什么回滚没有发生在MySQL中,而是发生在MariaDB中?

我的SQL日志小径

DataSourceTransactionManager     : Creating new transaction with name [TEST]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; 'jdbcDataSourceTransactionManager'

DataSourceTransactionManager  : Acquired Connection [HikariProxyConnection@436329238 wrapping 
com.mysql.jdbc.JDBC4Connection@2b464384] for JDBC transaction
JdbcTemplate               : Executing prepared SQL update

JdbcTemplate               : Executing prepared SQL statement [INSERT INTO TEST (dataNetwork,start, end, type, directory, rank) values(?, ?, ?,?,?,?)]

DataSourceTransactionManager     : Initiating transaction rollback

DataSourceTransactionManager     : Rolling back JDBC transaction on Connection [HikariProxyConnection@436329238 wrapping 

com.mysql.jdbc.JDBC4Connection@2b464384]
DataSourceTransactionManager     : Releasing JDBC Connection [HikariProxyConnection@436329238 wrapping 

com.mysql.jdbc.JDBC4Connection@2b464384] after transaction
DispatcherServlet        : Failed to complete request: 
java.lang.RuntimeException: To Test Roll Back

服务方式代码:

@Transactional(transactionManager = "jdbcDataSourceTransactionManager")
public void copyDataNetwork(WorkingFolderCopyRequest workingFolderCopyRequest,
      DataNetworkTransaction transaction) throws RuntimeException {
    dataNetoworkDao.copy(DataNetworkTables.DATA_NETWORK.getTableName(),
       DataNetworkTables.DATA_NETWORK.getColumnName(),
        workingFolderCopyRequest.getSource(), 
 workingFolderCopyRequest.getDestination());

    throw new RuntimeException("To Test Roll Back");
}

数据网络

@Repository
public class DataNetworkDAO  {

    private NamedParameterJdbcTemplate jdbcTemplate;

    @Autowired
    DataSource dataSource;

    public DataNetworkDaoImpl(@Qualifier("ooretaDataSource")DataSource dataSource) {
        this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }

    public void copy(String tableName, String dataNetworkColumn, String oldNetworkName, String newNetworkName) {
        String sql = "INSERT INTO TEST (dataNetwork,start, end, type, directory, rank) values(:dataNetwork, :start, :end,:type,:directory,:rank)";
        Map<String, Object> params = new HashMap<>();
        params.put("dataNetwork", "WF20");
        params.put("start", "2");
        params.put("end", "");
        params.put("type", "T");
        params.put("directory", "Temp");
        params.put("rank", 0);

        jdbcTemplate.update(sql, params);
        
    }
}

数据源配置

错误的autoCommit……………………………………………错误的HikariPool-2-启动… HikariPool-2-添加连接com.mysql.jdbc.JDBC4Connection@608eb42eHikariPool-2-启动完成。

o. h.e.j.e.i.Jdbc环境发起者:数据库-

o. h.e.j.e.i.Jdbc环境发起者:驱动程序-


共1个答案

匿名用户

经过所有的挣扎,我找到了原因。程序员快乐我在这个COVID时间得到了。

MySql有两个DB引擎MyISAM和InnoDB。这个遗留DB拥有所有带有MyISAM引擎的表。MyISAM引擎不支持事务。您无法回滚。

如果我们使用SHOW TABLE STATUS;然后它将显示哪个表具有哪个引擎类型,然后我们需要更改表引擎,如下所示以获得事务支持。

修改表

最后,回滚就像一个魅力。

链接阅读更多:

http://ronaldbradford.com/blog/using-rollback-with-myisam-2010-03-31/#:~: text=MySQL默认存储引擎,在增量随时间。