vlambda博客
学习文章列表

(日常疑问)同一个mysql为什么可以查询其他库的数据?

1、SpringBoot项目中,连接单个Mysql的某个数据库,是否可以查询其他数据库内的表数据和插入、更新数据?事务是否会生效?

2、和多个mysql只有一个数据库的区别是什么?

3、多个mysql不就是分布式了?那普通事务肯定不启用,那需要使用什么事务?

测试前提:

基于SpringBoot  + mybatis-plus

 /**
  * @author Rao
  * @Date 2021/1/13
  **/
 @TableName(schema = "user")
 @Data
 public class Tes {
 
  private Long id;
 
  private Integer num;
 
  private String name;
 
 }
 /**
  * @author Rao
  * @Date 2021/1/13
  **/
 @TableName(schema = "test")
 @Data
 public class Test {
 
  private Long id;
 
  private String name;
 
 }
 @Override
 @Transactional(rollbackFor = Exception.class)
 public void test(){
  List<User> users = userDao.selectList(null);
  log.info(JsonUtil.toString(users));
  log.info("------------");
 
  // 这里插入的是 同一个MySQL下的 user 数据库的 tes表
  Tes tes = new Tes();
  tes.setName("测试");
  int insert = tesDao.insert(tes);
  log.info("测试插入数据:{}",insert);
  log.info("------------");
 
  // 这里插入的是 同一个MySQL下的 test 数据库的test表
  Test test = new Test();
  test.setName("测试");
  int inserta = testDao.insert(test);
  log.info("测试插入数据:{}",inserta);
  log.info("------------");
 
  int i = 1 / 0;
 }

测试结果:

处理单个Mysql下的不同DataBase的Table数据,取决于项目连接Mysql的用户权限级别。

第一个问题:测试结果是,会保证事务数据中的一致性,连接用户具有操作其他DataBase的权限,即代表,尽管你连接的是 (xxxx:3306/a?xxx   )DATABASE:a ,表示你的sql不做任何处理默认是查询 a库下的表数据,如果你的model上加上@Tablename(schme="xxx"),指定,则可以访问其他你当前账号有权限访问的数据库的数据。事务不会即使更新其他数据库的数据,事务也不会受到影响。

Spring的事务是和连接有关系的,默认事务是自动提交的。

第二个问题:很明显,多个mysql涉及的就是多个资源的问题。这就相当于是分布式事务