rpc 引发的一个事务问题

先交待背景,俩个业务系统,一个后台,一个独立业务的api。俩个项目互相独立,业务不同,但是中间有相互调用的一块东西,走了一个消息队列的rpc调用方案。 

比如a系统里面有俩个业务会去调b系统,b提供了一个相同的方法。a系统里面 业务1是要先保存一个关系c(c相当于要存到数据库的一个关系),然后调用b的方法最后通知人,业务2是在有关系的记录之后处理别的才做的调用b系统。b系统里面会先验证有没有保存关系c 如果有才进行后续操作。就是这么一个场景每次都是走业务2没事,业务1有问题,b的方法里面有一些判断但是不至于影响执行结果。排查半天一直无果,后来联想到数据库的事务,因为毕竟走c这个是在数据库先存再调用b系统的。

这时候就得引出数据库的事务隔离级别,线上数据库( Repeatable read (可重复读):可避免脏读、不可重复读的发生。)。

----解决----

在a系统做c保存时新开事务并且强制提交事务。这样b里面的事务查询就可以正常查到。

DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) SpringContextUtil.getApplicationContext()
        .getBean("transactionManager");
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别,开启新事务,这样会比较安全些。
TransactionStatus status = transactionManager.getTransaction(def); // 获得事务状态
//事务单独提交一次
try {
      //do your business
    transactionManager.commit(status);
} catch (Exception e) {
    transactionManager.rollback(status);
    return false;
}

猜你喜欢

转载自my.oschina.net/u/2337666/blog/1820004
RPC