首页   注册   登录
 choice4 最近的时间轴更新

choice4

V2EX 第 261399 号会员,加入于 2017-10-21 20:42:25 +08:00
今日活跃度排名 1151
choice4 最近回复了
11 小时 37 分钟前
回复了 yidinghe 创建的主题 奇思妙想 最新的伪人工智能演示( Java )
你才是傻逼!
最后一句长的
还有退出码 666 怎么来的 emmm
11 小时 39 分钟前
回复了 yidinghe 创建的主题 奇思妙想 最新的伪人工智能演示( Java )
这不符合逻辑啊
13 小时 30 分钟前
回复了 choice4 创建的主题 Java 多数据源和事务
@abcbuzhiming 单数据源可以回滚, (我是直接是在创建 SqlSessionFactory bean 的时候 bean.setDataSource(a()))
这种方式设置的 (成功回滚)。
原来动态多数据源的时候相当于是 bean.setDataSource(dynamicDataSource()) (无法回滚)
17 小时 31 分钟前
回复了 choice4 创建的主题 Java 多数据源和事务
空格被吃了
17 小时 32 分钟前
回复了 choice4 创建的主题 Java 多数据源和事务
@abcbuzhiming 确定,不过不知道是不是别的哪里写错了 大致代码意思如下吧

@Configuration
class Config{
@Bean("a")
@PropertiesConfiguration("...")
public DataSource a() {return new DataSource;}

@Bean("b")
@PropertiesConfiguration("...")
public DataSource a() {return new DataSource;}

@Bean("dynamicDS")
public DataSource dataSource() {new DynamicDataSource(); setMap(asMap(a(), b())); return;}

@Bean
public SqlSessionFactory fac() {return new SqlSessionFactoryBean(dataSource()).getObject();}

@Bean("at")
public TransactionManager ma() {
return new TransactionManager(a());
// return new TransactionManager(dataSource()); //这种就会出现我在 #3 写的那种情况
}
}

@Service
class Service {
@Autowired
ADao aDao;
@Transactional(transaction="at", rollbackFor=RuntimeException.class)
public void insert() {
aDao.insert();
throw new RuntimeException();
}
}

@Mapper
interface aDao{
@DataSource("a") //自定义注解,aop 会动态选择 a 数据源
@Insert("......")
int insert();
}

@SpringbootTest
class Test() {
@Autowired
Service aService;

@Junit.Test
void test() {
aService.insert();
}
}

大概就是这个意思的代码吧。
18 小时 44 分钟前
回复了 ukipoi 创建的主题 Java 请教一下 Java MVC 设计里业务层的'业务'是什么?
简单的比如把数据库的 0 变成字符串的女 类似这种吧。。
19 小时 50 分钟前
回复了 choice4 创建的主题 Java 多数据源和事务
楼上应该是 DataSourceTransactionManager 不是 DataSourceManager。 打错了
19 小时 51 分钟前
回复了 choice4 创建的主题 Java 多数据源和事务
@abcbuzhiming 对 最开始想弄成一个事务管理器。大概如这中 retrun new DataSourceManager(dynamicDataSource)。
然后就会出现我在 #3 出现的那种错误。
后来我干脆就创建两个 DataSourceManager 的 bean。 比如分别指定 beanName 为 A, B。
然后在 service 层比如我用到 ADao 类。 就使用 @Transactional(transactionManager="A", rollbackFor=xxx.class)
并在 service 层抛出相应异常,但是不能回滚。我 debug 跟断点是
TransactionInterceptor.invoke(MethodInvocation) ---->
TransactionAspectJSupport.invokeWithinTransaction(Method, Class, final InvocationCallback) ----> TransactionAspectJSupport.completeTransactionAfterThrowing(TransactionInfo, Throwable)
看到了代码执行了
txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());
这一行 。并且是正常执行(这行没有出现异常)。但是事务就是没有回滚,想不明白为什么。难道我插入数据时使用的连接,和抛出异常事务回滚时的连接不一样?
20 小时 50 分钟前
回复了 choice4 创建的主题 Java 多数据源和事务
@helloZwq 事务呢?怎么加的
20 小时 51 分钟前
回复了 choice4 创建的主题 Java 多数据源和事务
@abcbuzhiming
/*
如果你再 service 层用了 @Transactional,那你就要保证这个 service 里调用的 mapper 都是一个库的
*/
我是在 service 层用了 @Transactional, 同时我在测试的时候也保证了这个 service 中的 mapper 都是一个库的,并且手动抛出了异常。 但是不行。因为是根据 dao 层方法上的注解去选择数据源。但是事务的开启是在 service 层, 但是开启一个事务又需要有确定的数据源。由于现在数据源还没有确定下来,也就是 AbstractRoutingDataSource 里面那个 determinkey 方法还没有执行,动态数据源还没有确定下来,(即开启事务的 aop 先于动态选择数据源的 aop 执行了)就出现了如下错误:
Could not open JDBC Connection for transaction; nested exception is java.lang.IllegalStateException: Cannot determine target DataSource for lookup key [null]
就是这样了。不知道有没有说明白
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   959 人在线   最高记录 4019   ·  
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.1 · 8ms · UTC 23:06 · PVG 07:06 · LAX 15:06 · JFK 18:06
♥ Do have faith in what you're doing.
沪ICP备16043287号-1