(日常疑问)同一个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涉及的就是多个资源的问题。这就相当于是分布式事务