使用jdbc和ScriptRunner 执行批量sql无法rollback的问题
2022/3/31 19:19:42
本文主要是介绍使用jdbc和ScriptRunner 执行批量sql无法rollback的问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
最近需要使用jdbc 执行一批SQL,但是一般情况下, 每次只能执行一个SQL语句。
有一些工具类可以帮助我们使用jdbc执行批量的sql。例如 mybatis的 ScriptRunner 和 Spring的 ScriptUtils 工具类;
这里使用 mybatis 的 ScriptRunner 来执行批量的sql;但是发现无法执行回滚操作,不管是不是setAutoCommit 为false。
对源码进行了分析,发现 ScriptRunner 存在一些缺陷,在 mybatis的3.5.9版本。相关代码如下:
private void commitConnection() { try { if (!connection.getAutoCommit()) { connection.commit(); } } catch (Throwable t) { throw new RuntimeSqlException("Could not commit transaction. Cause: " + t, t); } }
如果设置了 setAutoCommit 为true,每执行一个sql提交一次;无法回滚了。
如果设置了setAutoCommit 为false, ScriptRunner 内部又会如上图代码,手动的commit一下; 无法rollback。
因为我这里的需求是:仅仅执行sql去尝试探测,不需要commit, 那就做了一个Connection的代理,屏蔽掉 commit操作
public class NoCommitConnectionProxy extends ConnectionProxy { /** * @param conn 必须设置为 autoCommit为false */ public NoCommitConnectionProxy(Connection conn) { super(conn); } @Override public void commit() throws SQLException { //什么也不做 } }
如此, ScriptRunner 执行的内容就能回滚了。
这篇关于使用jdbc和ScriptRunner 执行批量sql无法rollback的问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-23DevExpress 怎么实现右键菜单(Context Menu)显示中文?-icode9专业技术文章分享
- 2024-12-22怎么通过控制台去看我的页面渲染的内容在哪个文件中呢-icode9专业技术文章分享
- 2024-12-22el-tabs 组件只被引用了一次,但有时会渲染两次是什么原因?-icode9专业技术文章分享
- 2024-12-22wordpress有哪些好的安全插件?-icode9专业技术文章分享
- 2024-12-22wordpress如何查看系统有哪些cron任务?-icode9专业技术文章分享
- 2024-12-21Svg Sprite Icon教程:轻松入门与应用指南
- 2024-12-20Excel数据导出实战:新手必学的简单教程
- 2024-12-20RBAC的权限实战:新手入门教程
- 2024-12-20Svg Sprite Icon实战:从入门到上手的全面指南
- 2024-12-20LCD1602显示模块详解