笔者今日学习了Spring的事务管理器,重点使用
org.springframework.jdbc.datasource.DataSourceTransactionManager,结合前段时间学习的mybatis,发现个很有趣的代码原理,和大家分享。
一:sqlSessionFactoryBean的配置
我给额外加了个事务工厂的属性:
其中transcationManage所指的是:
相当于说我想指定sqlSessionFactory的事务管理器使用Spring的。
然后启动就会报如下错误:
Caused by: java.lang.IllegalStateException: Cannot convert value of type [org.springframework.jdbc.datasource.DataSourceTransactionManager] to required type [org.apache.ibatis.transaction.TransactionFactory] for property 'transactionFactory': no matching editors or conversion strategy found
类型不匹配。
然后我就去找原因发现如下:
发现TransactionFactory接口有三个实现类
SpringManagedTransactionFactory.class
JdbcTransactionFactory.class
ManagedTransactionFactory.class
以上实现类全是基于TransactionFactory接口,其中sqlSessionFactoryBean默认的事务管理器是SpringManagedTransactionFactory。
说明为证:
Set the MyBatis TransactionFactory to use. Default is SpringManagedTransactionFactory The default
SpringManagedTransactionFactory should be appropriate for all cases: be it Spring transaction
management, EJB CMT or plain JTA. If there is no active transaction, SqlSession operations will
execute SQL statements non-transactionally. It is strongly recommended to use the default
TransactionFactory. If not used, any attempt at getting an SqlSession through Spring's MyBatis
framework will throw an exception if a transaction is active.
See Also:
SpringManagedTransactionFactory
Parameters:
transactionFactory the MyBatis TransactionFactory
就是说默认的事务管理器是SpringManagedTransactionFactory。
然后去找:
原因就在这了,DataSourceTransactionManager没有实现TransactionFactory接口,所以最后会类型不匹配错误。
总结:mybatis是自己独立的一套事务管理,线程安全,但是可拓展性很差。