使用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-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升