对连接池的事务控制

时间:2017-08-15 08:22:25

标签: java multithreading transactions connection-pooling

我有一个多线程应用程序,其中解析文件并插入数据库 - 我有一个数据库连接池用于写入数据库 - 我需要在解析/写入整个操作上添加事务控制,即如果有任何错误在解析/ db-insert操作期间,我想回滚整个操作,其中我的部分数据库写入需要回滚 - 有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

您需要从池中取出连接,在其上启动数据库事务,并在事务期间将其保留在池之外。只有在完成(提交或回滚)事务后,您才会将其返回池中。

这显然意味着您无法并行运行更多事务,而不是池中的连接。如果您不能接受此限制,则必须设计不依赖于数据库事务的自己的解决方法(例如,使用接受具有某些唯一标识符的数据的“阶段”表,然后立即将其移入主存储器,加上删除陈旧数据的任务。)

我建议您阅读Spring's transaction manager获取灵感。

答案 1 :(得分:0)

如果我理解正确,你有一个应用程序将文件分成几个部分,每个部分都由另一个线程解析,每个部分都使用它自己的池连接。

我认为如果您可以使用XA事务,事务管理器可以在这里提供帮助。每个连接将形成单独的事务分支,因此每个线程将在事务的单独参与者上工作。最后,2PC将确保全部承诺或回滚。