SQLException Table definition has changed, please retry transaction

Posted 太白的技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLException Table definition has changed, please retry transaction相关的知识,希望对你有一定的参考价值。

  近日,一开发说只要切换到mysql,执行到某一条查询就会发生SQLException Table definition has changed, please retry transaction,oracle就不会。换成另外一个mapper也不会有问题。同时select * from innodb_trx可以看出连接未释放(至于连接未释放,是因为commit的时候没有指定参数true,这依赖于mysql的默认行为)。经查,之所以出现该错,是因为mapper默认使用REUSE执行器,它导致了语句缓存,中间执行了truncate某个分区(另外一个连接的),但是原先的mapper未失效,故发生该问题。因为mysql 5.0.5以后的版本默认useServerPrepStmts=false。一般OLTP建议useServerPrepStmts=true&cachePrepStmts=true,其测试可见https://blog.csdn.net/alex_xfboy/article/details/83901351。

  解决方法:SqlSession重新getMapper(因为为了效率,我们mybatis配置默认的执行器为REUSE),即不会出现该问题。

  为什么oracle没有这个问题呢,LZ还未细查该环境,概率是因为没有使用server端的PreparedStatement的原因,后面有空看下。

以上是关于SQLException Table definition has changed, please retry transaction的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 java.sql.SQLException:[SQL7008] database_name 中的 table_name 对操作无效,而 sqoop 从 hdfs 导出到 DB2

为什么程序抛出SqlException:'每次运行'ItemID'附近的语法不正确? [关闭]

SqlException:无法将值 NULL 插入列“CarId”、表“AutoServiceDb.dbo.ServiceOrders”;列不允许空值。插入失败

何时使用 Microsoft.Data.SqlClient.SqlException 与 System.Data.SqlClient.SqlException?

java.sql.SQLException: SQL 语句在 org.hsqldb.jdbc.JDBCUtil.sqlException 处关闭

异常和 SQLException 的区别