2012-02-13 50 views
5

我发现下面的螺纹:How exactly JdbcTemplate with TransactionManager works together?Spring事务管理器是否将连接绑定到线程?

的该第一句:

据我理解的DataSourceTransactionManager结合从指定的数据源,以当前线程的JDBC连接,从而允许一个线程绑定每个数据源的连接。如果它是一个连接池,它将采用其中一个可用连接。

......正是我想知道的。

当使用事务管理器时,你最终会得到每个线程拥有自己的单一连接吗?此外,该连接还有多久?同一个线程在单个请求中是否使用相同的连接,还是有其他事情发生?我只是想了解当你有一个事务管理器的时候Spring究竟在做什么,当你不知道(不管你是否真的有事务)。

回答

10

当使用事务管理器时,最终每个线程都拥有自己的单个连接吗?此外,该连接还有多久?

该连接通常从连接池获得。当事务管理器启动事务时,连接从池中借用,然后在事务完成时返回到池。在此期间,连接被绑定到线程。

做同样的线程中使用整个一个请求

它使用的交易时间相同的连接相同的连接。请求本身是不相关的。不管你是否真的有交易

总是有交易,不管你做明确与否。如果您没有明确配置,那么JDBC驱动程序和数据库将在执行单个操作时启动并完成一个。 Spring的事务管理(或任何其他框架的事务管理)允许您跨多个操作延长该事务的生命周期。这样做需要在交易期间独占使用连接。

+0

谢谢你的回应。它有助于我更好地理解正在发生的事情。我了解事务管理如何允许事务扩展到多个操作。但是,就我而言,我在每个DAO方法上都有@Transactional(propagation = Propagation.SUPPORTS),这意味着每个调用都将使用它自己的独立事务。在管理器从池中获得初始连接之后,它会将该连接绑定到当前线程,然后从那里为线程的生命检索它,而不是返回到池以获取连接? – dnc253 2012-02-14 16:27:38

+0

“每次电话会使用它自己的独立交易” - 这是不正确的。您的DAO将“继承”已经绑定到线程的任何现有事务。除非没有绑定,否则它不会启动一个新的。 – skaffman 2012-02-14 16:33:09

+1

我想我定义“交易”的方式并不完全正确。我理解一个事务的方式是当你有一个单独的数据库操作(可以有任何数量的更新,插入等)。这一切发生或没有发生。 DAO的设置方式,每个方法都会独立于其他方法在DB上运行。如果一个方法失败,它不会影响其他方法在失败之前或之后执行的操作。那么,到底什么是“交易”呢?我认为每种方法都会创建它自己的新交易,但显然情况并非如此? – dnc253 2012-02-14 20:10:35

相关问题