单个连接上的多个数据库事务

时间:2008-12-11 03:49:22

标签: c++ mysql transactions database-connection

我有一个多线程程序,而每个线程在执行开始时从MySql连接池类获取单个连接。然后,该线程使用许多数据库表包装类通过将其数据库连接传递给包装类来执行其业务逻辑。这些包装类上的操作不一定是顺序的,我希望这些包装类能够使用单个数据库连接相互独立地提交或回滚其数据库表上的更改。我知道MySql不允许嵌套事务,也没有找到实现这一目标的方法。 任何帮助是极大的赞赏。 谢谢!

5 个答案:

答案 0 :(得分:2)

听起来你必须将事务与表包装器关联起来,而不仅仅是逐个线程。 IOW,您需要创建一个事务类。当事务打开和关闭时,事务类从/向连接池获取/释放连接。

然后事务成为表包装器的工厂。由事务创建的任何表包装器都在事务内部,因为它不能访问任何连接,而是事务所在的连接。

令人讨厌的部分是保持所有对象不会访问死对象。将需要某种形式的SmartPtr来处理事务提交时发生的事情,但有些事情试图再次使用表包装器。

答案 1 :(得分:1)

如果我正确理解了问题,我相信您唯一的选择是实现某种允许多个线程共享单个连接的事务队列。然后,每个线程都可以将“任务”添加到队列中,这需要在事务中执行。然后,您有一个从队列中选择这些任务的进程(您甚至可以在此处实现某种优先级)并将它们发送到数据库,然后将结果返回给发起请求的线程。调用线程会阻​​塞,直到它们收到结果,这是不理想的,但如果你真的需要有多个线程和多个事务,我就看不到另一种方法,没有多个连接。

答案 2 :(得分:1)

这是多个线程使用单个资源的典型示例。

解决方案就是在mysql连接操作上使用mutexes

答案 3 :(得分:1)

有连接池,为什么不获得更多连接?并且可能使用信号量来限制同时连接的数量。否则,您需要锁定单个连接或使用客户端事务(使用框架,这并不简单,如果只有一个,您将需要锁定连接,但与没有事务相比,等待时间将非常短在你的代码方面。)

答案 4 :(得分:1)

最简单的解决方案是为每个线程创建一个新连接 - 这通常是用Apache / PHP完成的。

如果写入的次数远远少于读取次数(10个线程中只有1个需要写入),则可以为SELECT使用一个全局连接,并为需要更新的每个线程创建新连接。

之后,您可能拥有一个最多10个用于写入的线程池(因此您最多可以有10个并发事务)。在一天结束时,如果你想要并发,那么你需要多个连接。