春季事务中的一个连接?

10

我有几个与连接和Spring事务相关的问题。

  1. 在事务中(传播级别REQUIRED),如果多个方法执行DML和DDL操作,Spring是否使用相同的连接实例?我已经阅读过它确实维护了相同的连接,但不知道它如何以技术方式实现。如果在解释时提供了任何Spring源代码的提示,将会很有帮助。

  2. 如果我将Serializable用作隔离级别,使用Spring声明式事务,Spring会确保在该方法或从原始事务方法调用的任何其他方法中执行数据库操作时始终使用一个连接吗?

考虑到这个主题,我需要注意哪些事项才能使用Spring事务工作?

非常感谢您对这个主题的任何想法/帮助。

更新1 - 抱歉,我错误地写成了可序列化传播级别,而不是隔离级别。已更正。

1个回答

8
  1. Spring事务管理只是不同事务资源(如JDBC连接)的统一接口。由于对于大多数事务资源来说,跨越多个连接的事务并没有意义,因此这些资源在Spring管理的事务中的所有操作都在同一个连接中执行。当然,如果使用了JtaTransactionManager进行分布式事务,则参与分布式事务的每个事务资源都将拥有自己的连接。

  2. 事务隔离级别与Spring事务管理无关。它们的含义是在数据库理论中定义的。 它们也与事务传播无关。

Spring通过使用TransactionSynchronizationManager将连接(例如JDBC Connection)作为线程局部状态的一部分来实现此行为。例如,请参见DataSourceUtils


请您详细说明以下几点:
  1. “由于对于大多数事务性资源而言,跨多个连接的事务是没有意义的。” 您所指的事务性资源是哪些?
  2. Spring 是如何在内部管理以便在一个事务中获取相同的连接来执行所有数据库操作的?(如果您能提供一些 Spring 代码让我参考就更好了。)
- Andy Dufresne
在问题中,我错误地添加了可序列化传播级别,而不是隔离级别。已经更正。 - Andy Dufresne
Spring内部是如何管理在一个事务中进行的所有数据库操作都使用相同的连接的呢?(如果您能指出一些Spring代码,我可以看一下就更好了)。 - Andy Dufresne
@axtavt:感谢您更新Spring源代码。从TransactionSynchronizationManager实现(绑定和解绑资源方法)来看,当在事务中执行时,似乎永远不会出现多个连接实例用于给定数据源的情况,对吗?即使在分布式事务的情况下也是如此。此外,我仍然不清楚您为什么认为跨多个连接的事务没有意义?如果在同一事务中使用多个连接会出现什么问题? - Andy Dufresne
@axtavt - 你能详细解释一下为什么数据库事务与特定连接密切相关吗?如果这些后续问题让你感到烦恼,我很抱歉,但我想要澄清自己对此的概念。 - Andy Dufresne
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接