前提:
service中定义了两个接口且都被@Transactional管理
问题:
在controller中调用其中一个service接口不管接口里面多少dao操作数据库,他们都是用的同一个数据库连接,因为ConnectHolder放在了TransactionSynchronizationManager的resources中,但是当controller两个service接口都调用的时候,第二个service接口还是用的上一个service接口的数据库连接么?
拿mybatis来说,第一次事务aop开始的时候,ConnectHolder会被绑定到ThreadLocal中,mybatis的sqlsession获取db connection,则是从通过Transaction接口获取connection,具体整合到spring以后,这个接口的实现类则是SpringManagedTransaction,它最终调用的则是DataSourceUtils.getConnection(this.dataSource),最终还是回到了ConnectionHolder,此时就回到了你的问题,如果第一次事务结束的时候,如果ConnectionHolder被清空,则不是同一个connection,实际从结果上都知道,在一个事务里面(和哪里调用无关),都是同一个connection,原因则是在事务管理器这里,不需要提交事务的时候,虽然也会走到提交事务这个方法里面,但是不会提交connection,提交事务以后,会触发TransactionSynchronization(准确的说则是ConnectionSynchronization)的afterCompletion方法,此时才会调用TransactionSynchronizationManager.unbindResourceIfPossible(this.dataSource),这才释放了connectionholder
2个service,第一个执行完,连接就释放了。