在ServiceImpl
上面加了@DS
注解,指明了该Service
使用哪个库(比如叫schema_business
)。正常使用没有问题。
有一次在一个使用主库对应Service
的方法中调用了这个Service
,就报了错,错误内容主要是说表不存在,其实是库错了,大致如下:
Table ‘schema_master.business_table‘ doesn‘t exist
因为business_table
这个表不在schema_master
中,而在schema_business
中。
这时候有两种解决方法:
- 在实体类上的
@TableName
注解中加入schema,两种写法如下:
# 写法一
@TableName("schema_business.business_table")
# 写法二
@TableName(value="business_table", schema="schema_business")
然而这种写法存在一个问题,就是不同环境库名可能不同,到时候要么把库名改一致,要么改代码,比较麻烦。
- 而究其根源,这个问题的主要原因在于主库对应
Service
的方法中加了事务@Transactional
,而默认传递机制为REQUIRED,导致被调用的Service
加入了该事务,从而与调用方使用了相同的库。
解决方法就是在被调用的方法上把事务传递机制修改一下。比如改为REQUERES_NEW
,该传递机制会暂时将前面的事务挂起,开启新的事务。附上写法:
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
网友评论