【问题标题】:Does the Spring transaction manager bind a connection to a thread?Spring 事务管理器是否将连接绑定到线程?
【发布时间】:2012-03-05 06:51:04
【问题描述】:

我找到了以下线程:How exactly JdbcTemplate with TransactionManager works together?

第一句话:

据我了解,DataSourceTransactionManager 将指定 DataSource 的 JDBC 连接绑定到当前线程,允许每个 DataSource 一个线程绑定连接。如果它是一个连接池,它将占用一个可用的连接。

...正是我想知道的。

在使用事务管理器时,您最终是否会让每个线程都有自己的单个连接?另外,这种连接能持续多久?同一个线程是否在单个请求中使用相同的连接,还是有其他事情发生?我只是想了解当你有事务管理器和没有事务管理器时 Spring 到底在做什么(不管你是否真的有事务)。

【问题讨论】:

    标签: spring spring-transactions transactionmanager


    【解决方案1】:

    在使用事务管理器时,您最终是否会让每个线程都有自己的单个连接?另外,这种连接的寿命是多久?

    连接一般是从连接池中获取的。事务管理器启动事务时从池中借用连接,然后在事务完成时返回池中。在此期间,连接被绑定到线程。

    同一个线程在单个请求中是否使用同一个连接

    它在事务期间使用相同的连接。请求本身无关紧要。

    不管你是否真的有交易

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

    【讨论】:

    • 感谢您的回复。它可以帮助我更多地了解正在发生的事情。我了解事务管理如何允许事务扩展到多个操作。但是,就我而言,我的每个 DAO 方法都有 @Transactional(propagation=Propagation.SUPPORTS) ,这意味着每个调用都将使用它自己的独立事务。在管理器从池中获得初始连接后,它是否将该连接绑定到当前线程,然后在线程的整个生命周期中从那里检索它,而不是回到池中获取连接?
    • “每个调用都将使用它自己的独立事务” - 这是不正确的。您的 DAO 将“继承”任何已经绑定到线程的现有事务。它不会开始一个新的,除非已经没有绑定。
    • 我想我定义“交易”的方式并不完全正确。我理解事务的方式是当你有一个单一的数据库操作(可能有任意数量的更新、插入等)时,这一切都会发生或没有发生。 DAO 的设置方式,每个方法都将独立于其他方法对 DB 进行操作。如果一种方法失败,它不会影响其他方法在失败之前或之后执行的操作。那么,究竟什么是“交易”呢?我在想每种方法都会创建自己的新事务,但显然情况并非如此?
    • 你们知道DataSourceTransactionManager获取的连接的生命周期是多少吗?
    • 连接何时关闭? jdbctemplate 方法何时完成,或者实际事务何时完成?
    猜你喜欢
    • 2015-07-30
    • 2013-05-26
    • 1970-01-01
    • 2020-09-11
    • 2021-02-20
    • 2010-11-30
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多