2014-03-01 28 views
1

我正在研究一个广泛使用春季交易的项目。我碰巧发现我正在抛出一个异常,而没有正确处理它没有提交或回滚事务的离子。所以即使线程停止,连接仍然保持活动状态。当向web服务器(Apache tomcat 7.0)发出新的请求时,Spring提供了与新线程的较早连接。由于线程没有启动连接,因此线程无法关闭它,也就是说,.commit不起作用。因为即使在没有异常的情况下,对象在后续事务中也不会持久保存在数据库中。我该如何解决这个问题,以便我可以检测到实际问题发生在哪里,或者可以设计一个退出点,我可以在响应发送到浏览器之前明确地关闭事务。Spring是否真的为每个线程提供新的事务?

+0

您的诊断可能是错误的。无论您如何处理异常,Spring都会为您提交或回滚事务:如果从事务性方法抛出运行时异常,则事务将回滚。否则,它承诺。但是,您有责任始终关闭JDBC连接。如果你使用Spring的JdbcTemplate,Spring也会为你做。 –

+0

也许你从来没有使用Spring的Programatic Transaction Approah。如果你看看Spring代码的相同,我们可以看到事务是基于线程的,其中TransactionStatus对象被绑定到每个带有isOwner作为布尔标志的函数,从而赋予函数最终提交决策的权力。 –

+0

如果我们不在owner函数中编写任何.Commit或.rollback,那么TransactionStatus的对象引用会丢失,当从线程池返回相同的线程时,新的事务永远不会启动,并且它会在先前的事务中被包装,最终u永远不会进行转换,并且在一段时间不活动后我们会关闭连接。 –

回答

0

默认情况下,从@Transactional方法抛出的运行时未检查异常或错误将回滚该事务;默认情况下,返回或检查异常将提交事务。您可以告诉Spring使用@Transactional注释的注释类型元素来覆盖该行为。

Spring框架参考手册有一个entire chapter devoted to transaction management。你需要阅读并理解这一点作为你的出发点。

+1

A * runtime *异常回滚事务。检查的异常不会。 –

+0

澄清了答案。 –

相关问题