MySQL:跨多个线程的事务

时间:2010-03-22 20:49:59

标签: mysql multithreading transactions

初步

我有一个应用程序,它维护一个大约100个线程的线程池。每个线程可以在新任务替换之前持续大约1-30秒。当一个线程结束时,该线程几乎总是会导致将1-3条记录插入表中,所有线程都使用该表。目前,不存在任何事务支持,但我现在尝试添加它。此外,该表是InnoDB。所以......

目标

我想为此实现一个事务。此事务是否提交或回滚的规则驻留在主线程中。基本上有一个简单的函数会返回一个布尔值。

  1. 我可以跨多个连接实现交易吗?
  2. 如果没有,多个线程可以共享同一个连接吗? (注意:这里有很多插入,这是一个要求)。

3 个答案:

答案 0 :(得分:5)

1)不,交易仅限于单个数据库连接。

2)是的,可以跨多个线程共享连接(和事务)。

答案 1 :(得分:3)

好吧,正如其他答案中所述,您无法跨多个连接创建事务。并且您可以跨线程共享单个连接。 然而你需要非常小心。您需要确保只有一个线程同时写入连接。您不能让多个线程在同一个连接上进行通信,而无需以某种方式同步其活动。如果允许两个线程同时进行通话(客户端库中的内存损坏等),则可能会发生错误。使用互斥或​​关键部分来保护连接对话可能是最佳选择。

-Don

答案 2 :(得分:0)

通常使用连接池实现共享许多线程之间的连接。每个线程都可以从池请求连接,将其用于其目的(一个或多个事务,已提交或回滚),并在任务完成后将其交回池中。

这就是应用服务器为您提供的功能。他们也会处理交易,我。即当请求事务的方法正常完成时,提交更改,如果它抛出异常,则回滚数据库事务。

我建议您查看Java EE 5或6 - 它非常易于使用,甚至可以在嵌入式系统中使用。为了便于启动,请查看Netbeans和Glassfish应用程序服务器。但是,一般概念同样适用于所有应用程序服务器。

对于InnoDB,处理大量事务不会有任何问题。在应用服务器的监督下,您可以专注于业务逻辑,而不必担心半封写更新或任何人在发生交易之前看到更新/插入已经提交。

InnoDB使用MVCC(多版本并发控制),有效地为每个事务呈现整个数据库的启动时的快照。您可以在相关问题中阅读有关MVCC的更多信息:Question 812512