3

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

4

5 回答 5

2

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

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

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

于 2008-12-11T04:26:17.327 回答
1

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

于 2008-12-11T04:04:31.893 回答
1

好吧,这是多个线程使用单个资源的经典示例。

解决方案就是在 mysql 连接操作上使用互斥锁。

于 2008-12-11T04:25:10.527 回答
1

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

于 2008-12-11T04:39:43.400 回答
1

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

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

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

于 2008-12-11T04:55:23.617 回答