2017-08-15 55 views
1

我有一个多线程的应用程序,其中解析文件并插入数据库 - 我有一个数据库连接池写入数据库 - 我需要添加事务控制通过解析/写入整个操作即如果在解析/ db-insert操作期间出现任何错误,我想回滚整个操作,其中我的部分数据库写入需要回滚 - 是否有任何方法可以执行此操作?通过连接池的事务控制

回答

0

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

这显然意味着您不能并行运行更多的事务,而不是您的池中有连接。如果你不能接受这个限制,你将不得不设计你自己的解决方案,它不依赖于数据库事务(例如,使用“stage”表来接受带有一些唯一标识符的数据,然后立即将它移动到主存储中,加上删除陈旧数据的任务)。

我建议您阅读Spring's transaction manager寻求灵感。

0

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

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