春季交易中的一个连接?

Posted

技术标签:

【中文标题】春季交易中的一个连接?【英文标题】:One connection in spring transaction? 【发布时间】:2011-08-27 07:40:36 【问题描述】:

我有几个关于连接和弹簧事务的问题。

    当在一个事务中执行多个执行 DML 和 DDL 操作的方法时,spring 是否使用相同的连接实例(传播级别需要)​​?我读过它确实保持相同的连接,但不知道为什么以及如何在技术上做到这一点?在解释如何提供 spring 源代码中的任何提示时,它会有所帮助。

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

考虑到这个主题,在使用 Spring Transactions 时我应该记住哪些要点?

对此主题的任何想法/帮助将不胜感激。谢谢。

更新 1 - 抱歉,我写的是可序列化传播级别而不是隔离级别。更正了它。

【问题讨论】:

【参考方案1】:

    Spring 事务管理只是对不同事务资源的统一接口,例如 JDBC 连接。由于对于大多数事务性资源来说,跨多个连接传播事务是没有意义的,因此 Spring 管理的事务中针对这些资源的所有操作都在同一个连接中执行。当然,如果你使用JtaTransactionManager的分布式事务,分布式事务中涉及的每个事务资源都会有自己的连接。

    事务隔离级别与 Spring 事务管理无关。 Their meaning is defined in the database theory。此外,它们与事务传播无关。

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

【讨论】:

您能否详细说明以下几点。 1.“由于对于大多数事务性资源而言,跨多个连接传播事务是没有意义的”。您指的是哪些事务资源? 2. spring 如何在内部设法为事务中完成的所有 db 操作获得相同的连接? (如果你能指出一些弹簧代码,我可以看看它会很棒)。 在问题中我错误地添加了可序列化传播级别而不是隔离级别。已更正。 @Amit:事务资源是提供事务行为的资源。基本上,它是数据库和消息队列。 以及 spring 如何在内部设法为事务中完成的所有数据库操作获得相同的连接? (如果你能指出一些弹簧代码,我可以看看它会很棒)。 @axtavt:感谢春季源代码更新。从 TransactionSynchronizationManager 实现(绑定和取消绑定资源方法)看来,在事务中执行时,似乎永远不会有多个连接实例用于给定数据源的场景,对吧?即使在分布式事务的情况下。另外,我仍然不清楚您的观点,为什么交易跨越多个连接没有意义?如果在同一个事务中使用多个连接会出现什么问题?

以上是关于春季交易中的一个连接?的主要内容,如果未能解决你的问题,请参考以下文章

春季启动错误突然没有互联网连接

在春季启动一段时间后,数据库连接丢失

春季启动时出现Cors错误,将其与反应连接并尝试在tomcat或jboss服务器上部署?

iTunes 连接销售和趋势中的交易类型更新是啥意思?

Jooq 不使用春季交易

萤石春季发布会:4+N产品体系再升级EZVIZ Connect连接智能生活