初步:
我有一个应用程序,它维护一个大约100个线程的线程池。每个线程可以在新任务替换之前持续大约1-30秒。当一个线程结束时,该线程几乎总是会导致将1-3条记录插入表中,所有线程都使用该表。目前,不存在任何事务支持,但我现在尝试添加它。此外,该表是InnoDB。所以......
目标
我想为此实现一个事务。此事务是否提交或回滚的规则驻留在主线程中。基本上有一个简单的函数会返回一个布尔值。
答案 0 :(得分:5)
1)不,交易仅限于单个数据库连接。
2)是的,可以跨多个线程共享连接(和事务)。
答案 1 :(得分:3)
好吧,正如其他答案中所述,您无法跨多个连接创建事务。并且您可以跨线程共享单个连接。 然而你需要非常小心。您需要确保只有一个线程同时写入连接。您不能让多个线程在同一个连接上进行通信,而无需以某种方式同步其活动。如果允许两个线程同时进行通话(客户端库中的内存损坏等),则可能会发生错误。使用互斥或关键部分来保护连接对话可能是最佳选择。
-Don
答案 2 :(得分:0)
通常使用连接池实现共享许多线程之间的连接。每个线程都可以从池请求连接,将其用于其目的(一个或多个事务,已提交或回滚),并在任务完成后将其交回池中。
这就是应用服务器为您提供的功能。他们也会处理交易,我。即当请求事务的方法正常完成时,提交更改,如果它抛出异常,则回滚数据库事务。
我建议您查看Java EE 5或6 - 它非常易于使用,甚至可以在嵌入式系统中使用。为了便于启动,请查看Netbeans和Glassfish应用程序服务器。但是,一般概念同样适用于所有应用程序服务器。
对于InnoDB,处理大量事务不会有任何问题。在应用服务器的监督下,您可以专注于业务逻辑,而不必担心半封写更新或任何人在发生交易之前看到更新/插入已经提交。
InnoDB使用MVCC(多版本并发控制),有效地为每个事务呈现整个数据库的启动时的快照。您可以在相关问题中阅读有关MVCC的更多信息:Question 812512