【问题标题】:Multiple database transactions on a single connection单个连接上的多个数据库事务
【发布时间】:2008-12-11 03:49:21
【问题描述】:

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

【问题讨论】:

    标签: c++ mysql transactions database-connection


    【解决方案1】:

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

    事务然后成为您的表包装器的工厂。事务创建的任何表包装器都在事务内部,因为除了事务所在的连接之外,它无法访问任何连接。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

            之后,您可能会拥有一个包含最多 10 个线程的池用于写入(因此您最多可以有 10 个并发事务)。归根结底,如果您想要并发,那么您需要多个连接。

            【讨论】:

              猜你喜欢
              • 2011-06-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-07
              • 1970-01-01
              • 2019-01-06
              • 2012-02-21
              • 2012-01-08
              相关资源
              最近更新 更多