1. MyBatis 与 Spring AOP 的协作(事务边界)
请说明 MyBatis 与 Spring AOP 的协作,特别是在事务边界上的配合?
- 事务边界与 SqlSession 的绑定
- Spring AOP 的 @Transactional 代理
- SqlSessionTemplate 的事务感知
MyBatis 与 Spring 集成时,SqlSessionTemplate 会感知当前 Spring 事务:当方法被 @Transactional 标记(由 Spring AOP 代理处理)时,事务内共用一个 SqlSession(绑定到事务),事务结束提交/回滚并释放连接。Spring AOP 的事务拦截器在方法进入时开启事务、绑定 SqlSession,方法退出时提交/回滚,从而划定了事务边界与 SqlSession 生命周期。MyBatis 的一系列操作(Mapper 调用)都在这个事务边界内执行,共享同一连接,保证一致性。若事务边界外调用,则每个操作开启独立 SqlSession。
事务边界由 Spring AOP 划定,SqlSession 绑定到该事务。理解"事务内单例 SqlSession"与 AOP 代理的配合,是掌握 MyBatis-Spring 事务语义的关键。需注意自调用、非 public 方法等会使 AOP 代理失效。