package com.github.trang.dynamic.plugin; import com.github.trang.dynamic.dynamic.DynamicDataSourceHolder; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.TransactionDefinition; import javax.sql.DataSource; /** * 自定义事务管理器 * 约定: * 1. 默认/非事务/事务且只读走从库 * 2. 事务且可写走主库 * * @author trang */ public class DynamicDataSourceTransactionManager extends DataSourceTransactionManager { private static final long serialVersionUID = 1L; public DynamicDataSourceTransactionManager(DataSource dataSource) { super(dataSource); } /** * 事务开始前将数据源手动设置进去 */ @Override protected void doBegin(Object transaction, TransactionDefinition definition) { //若有 @Transaction 注解,并且不是只读,设置为主库 if (!definition.isReadOnly()) { DynamicDataSourceHolder.routeMaster(); } super.doBegin(transaction, definition); } /** * 事务完成后清除 ThreadLocal */ @Override protected void doCleanupAfterCompletion(Object transaction) { DynamicDataSourceHolder.clear(); super.doCleanupAfterCompletion(transaction); } }