场景: 同一个接口方法里有多个数据库操作,A操作为插入数据库操作,数据库B为查询操作,B操作依赖于A操作,如果只是直接编写代码A、B操作,可能会出现B不能得到正确结果情况。A操作执行数据库插入操作,B再去查询,但执行A的时候,可能还没有执行完成就执行到B操作了,那么B就不会的到正确的结果。

解决: 显示声明事务(在外层事务A里面手动开启事务B,并且设置B事务为传播性PROPAGATION_REQUIRED_NEW)

@Autowired
private DataSourceTransactionManager transactionManager;
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
/**
* 设置事务传播特性(目前为PROPAGATION_REQUIRED_NEW:如果当前存在一个事务,则加入当前事务。如果不
* 存在任何事务,则创建一个新的事务。总之,要至少保证在一个事务中运行。)
*/
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
//开启事务
TransactionStatus status = transactionManager.getTransaction(def);
//数据操作
try{
    //A操作
    A.insert();
	transactionManager.commit(status);
}catch (Exception e){
    e.printStackTrace();
    transactionManager.rollback(status);
}
//B操作
B.select()