搞定了。。。不要重写事务管理器。。。
1. 重写 DataSourceTransactionManager的dobegin 方法 使用 如下代码来判断是否进入 事务;
JdbcTransactionObjectSupport transaction1 = (JdbcTransactionObjectSupport) transaction;
if (!transaction1.hasConnectionHolder() || transaction1.getConnectionHolder().isSynchronizedWithTransaction()){
logger.info("it seems it is in transaction ");
//do thread local bind in transaction status
}
2. 重写 DataSourceTransactionManager的prepareSynchronization 方法
@Override
protected void prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition) {
super.prepareSynchronization(status, definition);
if (MasterSlavesDataSourceSynchronization.isInTransaction()){
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCompletion(int status) {
// do your thread local resource clean
}
});
}
}
3. 对 Connection 及 statement 以及 prepareStatement 的 更新及事务方法 进行 拦截 在 slave data source 上 直接 抛异常即可
4. 要求更新 操作必须使用事务, 事务的所有操作都会route 到master,其余再无其他要求