【发布时间】:2017-08-15 08:22:24
【问题描述】:
我有一个多线程应用程序,其中正在解析文件并插入数据库 - 我有一个用于写入数据库的 db 连接池 - 我需要在解析/写入整个操作上添加事务控制,即在出现任何错误的情况下在 parse/db-insert 操作期间,我想回滚整个操作,其中我的部分数据库写入需要回滚 - 有没有办法做到这一点?
【问题讨论】:
标签: java multithreading transactions connection-pooling
我有一个多线程应用程序,其中正在解析文件并插入数据库 - 我有一个用于写入数据库的 db 连接池 - 我需要在解析/写入整个操作上添加事务控制,即在出现任何错误的情况下在 parse/db-insert 操作期间,我想回滚整个操作,其中我的部分数据库写入需要回滚 - 有没有办法做到这一点?
【问题讨论】:
标签: java multithreading transactions connection-pooling
您需要将连接从池中取出,在其上启动数据库事务,并在事务期间将其保持在池外。只有在完成(提交或回滚)事务后,您才会将其返回到池中。
这显然意味着您并行运行的事务不能超过池中的连接数。如果你不能接受这个限制,你将不得不设计你自己的不依赖数据库事务的解决方法(例如,使用一个“阶段”表来接受具有一些唯一标识符的数据,然后立即将其移动到主存储中,加上删除过时数据的任务)。
我建议阅读 Spring's transaction manager 以获得灵感。
【讨论】:
如果我理解正确,您有一个应用程序将文件分成几个部分,每个部分都由不同的线程解析,并且每个部分都使用来自池的自己的连接。
如果您可以使用 XA 事务,我认为事务管理器可以提供帮助。每个连接将形成一个单独的事务分支,因此每个线程将在事务的单独参与者上工作。最后,2PC 将确保所有提交或回滚。
【讨论】: