Java Spring事务管理

如果之前曾询问此问题或类似问题,请原谅 . 我是Spring的新手 . 我的问题是,事务管理器和JdbcTemplate是如何使用相同的数据库连接的 . 在所有的文档和书籍中,我可以把手放在它上面“说两个bean(事务管理器和JDBC模板)都有一个数据源 . 让它成为Apache Commons BasicDataSource . 据我所知,实例化时的两个对象都将调用数据源的方法getConnection()并给出不同的连接 . 之后,JDBC模板的更新将在一个连接上执行,而事务管理器在另一个连接上提交 . 绝对不会发生任何交易行为 .

我哪里错了?

实际上我的程序有点复杂 . 它是多线程的,它管理连接池 . 最初每个线程获得“连接”(实际上是JdbcTemplate对象),然后使用它直到终止 . 在其生命周期中,它执行一系列数据库更新“批处理”,这必须是事务性的 . 但尝试使用@Transactional注释失败 - 如果批处理中有两个插入操作而第二个操作失败,则第一个不会回滚 .

DataSourceTransactionManager和JdbcTemplate都引用beans.xml中的相同BasicDataSource .

很明显,在我对Spring的事务管理mecahism的理解中,我非常错误,因为其他人愉快地使用它 . 但确实在哪里?

回答(1)

2 years ago

其实你可以看一下JdbcTemplate的来源 .

你可以看到它没有直接从数据源获得连接,而是 Connection con = DataSourceUtils.getConnection(getDataSource()); .

这些DataSourceUtils负责从Spring线程本地connection holder获取当前事务连接或从DataSource实例化新连接,并在事务中首次请求时将其注册到持有者中 .

附:而且can't以简单的方式使用Spring事务机制获得跨多个线程运行的单个事务 .