Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有MySQL和Maria DB提交和回滚问题的Spring Boot JDBCTemplate_Mysql_Spring Boot_Mariadb_Jdbctemplate - Fatal编程技术网

带有MySQL和Maria DB提交和回滚问题的Spring Boot JDBCTemplate

带有MySQL和Maria DB提交和回滚问题的Spring Boot JDBCTemplate,mysql,spring-boot,mariadb,jdbctemplate,Mysql,Spring Boot,Mariadb,Jdbctemplate,我使用Spring引导框架和JDBCTemplate来访问数据库。我使用事务注释来强制DB调用的事务 @Transactional(rollbackFor = IllegalStateException.class, propagation = Propagation.REQUIRES_NEW) 使用Maria DB,我可以看到下面的日志记录了事务的顺序和我的事务回滚,但没有提交任何内容 o.s.j.d.DataSourceTransactionManager : Creating n

我使用Spring引导框架和JDBCTemplate来访问数据库。我使用事务注释来强制DB调用的事务

@Transactional(rollbackFor = IllegalStateException.class, propagation = Propagation.REQUIRES_NEW)
使用Maria DB,我可以看到下面的日志记录了事务的顺序和我的事务回滚,但没有提交任何内容

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更改仍然提交

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
在调试模式下,我能够看到JDBC template.execute调用Conferences记录提交的时刻,以及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
服务方法代码:

数据网络DAO

@存储库
公共类DataNetworkDAO{
私有名称参数jdbcTemplate jdbcTemplate;
@自动连线
数据源数据源;
公共数据网络DAOImpl(@Qualifier(“ooretadasource”)数据源数据源){
this.jdbcTemplate=新名称参数jdbcTemplate(数据源);
}
公共无效副本(字符串tableName、字符串dataNetworkColumn、字符串oldNetworkName、字符串newNetworkName){
String sql=“插入测试(dataNetwork,start,end,type,directory,rank)值(:dataNetwork,:start,:end,:type,:directory,:rank)”;
Map params=新的HashMap();
参数put(“数据网络”、“WF20”);
参数put(“开始”、“2”);
参数put(“结束”,“结束”);
参数put(“类型”、“T”);
参数put(“目录”、“临时”);
参数put(“秩”,0);
jdbcTemplate.update(sql,params);
}
}
数据源配置

HikariPool-2-配置: allowPoolSuspension…………错误 自动提交……错误 HikariPool-2-启动。。。 HikariPool-2-添加了com.mysql.jdbc连接。JDBC4Connection@608eb42e HikariPool-2-启动完成

o、 h.e.j.e.i.JDBCEnvironment发起人:数据库-> 名称:MySQL版本:5.1.73-社区专业:5小调:1

o、 h.e.j.e.i.JDBCEnvironment启动器:驱动程序-> 名称:MySQL连接器Java版本:MySQL-Connector-Java-5.1.25
(修订版:${bzr.Revision id})大调:5小调:1经过所有的努力,我找到了原因。我在这个新时代得到的快乐

MySql有两个DB引擎MyISAM和InnoDB。这个遗留数据库拥有MyISAM引擎的所有表。MyISAM引擎不支持事务。你不能后退

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

ALTER TABLE ENGINE='InnoDB'

最后,回滚非常有效。

链接阅读更多信息:


经过所有的努力,我找到了原因。我在这个新时代得到的快乐

MySql有两个DB引擎MyISAM和InnoDB。这个遗留数据库拥有MyISAM引擎的所有表。MyISAM引擎不支持事务。你不能后退

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

ALTER TABLE ENGINE='InnoDB'

最后,回滚非常有效。

链接阅读更多信息:


.

添加用于每个数据库的数据库驱动程序-MariaDB和MySQL.org.MariaDB.jdbcmariadb-java-client2.1.2 mysqlmysql-connector-java5.1。49@ShankarPS知道它为什么会这样吗?在调试期间,我观察到jdbatemaplate.execute调用在数据库中添加记录,我可以通过workbench查询该记录,下一个日志行是回滚,但记录仍然存在。请添加以下内容。1.MySQL的日志跟踪。2.该方法的源代码添加用于每个DB-MariaDB和MySQL.org.MariaDB.jdbcmariadb-java-client2.1.2 mysqlmysql-connector-java5.1的数据库驱动程序。49@ShankarPS知道它为什么会这样吗?在调试期间,我观察到jdbatemaplate.execute调用在数据库中添加记录,我可以通过workbench查询该记录,下一个日志行是回滚,但记录仍然存在。请添加以下内容。1.MySQL的日志跟踪。2.方法的源代码
@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);
        
    }
}