两个疑问
一、问题描述
本章开篇老师说:“比如,将笔记本中的MySQL数据,导入到台式机的MySQL里。直接拷贝覆盖数据目录,粗暴危险。两者创建的用户并不相同,会导致台式机的目录账户被覆盖丢失。”
我没有明白:既然用户不相同,为啥还是覆盖呢?比如,在电脑中复制文件,不都是文件名相同,才会覆盖替换吗?
二、问题描述
课堂上,我感觉下面的错误演示跟正确演示中后两步挺像的,都是事务A提交了,为什么两个的结果不一样的?
请老师解答。谢谢!
相关代码如下:
1.错误的演示
- SQL面板1:
START TRANSACTION ;
UPDATE t_emp SET sal=1;
COMMIT;
执行上述语句:开启事务,修改数据,提交数据成功:
- SQL面板2:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; # 既然能重复读取结果一致,只能读取到事务开始之前
START TRANSACTION ;
SELECT empno,ename,sal FROM t_emp;
怎么读到了事务A 提交以后的结果?收到了其他事务的影响?
2.正确的演示
- SQL面板1:
START TRANSACTION ; # 事务开启
UPDATE t_emp SET sal=1;
只开启事务、修改数据,不提交
- SQL面板2:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION ;
SELECT empno,ename,sal FROM t_emp;
查询的是:事务A的原始数据:
- SQL面板1:
COMMIT; # 提交
- SQL面板2:
SELECT empno,ename,sal FROM t_emp;
重新查询下,发现:查询的仍是事务A的原始数据:
3.小结
不管事务A你提不提交,对于事务B来说,查询的都是A之前的原始数据。
正在回答 回答被采纳积分+1
同学你好,
1.mysql中有一个数据表用于存储和管理mysql的用户(在课程学习中,我们使用的是root账户,而实际开发时并不会操作root账户,而是具有特定权限的账户),如果将笔记本电脑中的mysql用户直接复制粘贴到台式电脑中,那么就会将台式机电脑中的用户覆盖掉,就会导致台式电脑中的用户信息丢失。
2.在错误的演示中的 SQL面板1中已经将事务中的sql语句COMMIT,也就是修改后的数据已经持久化到数据库中,由于在COMMIT前在SQL面板2中并没有查询数据,导致在COMMIT之后在SQL面板2中的事务中查询到的是数据库中的数据。
3.在正确的演示中由于SQL面板1中的事务中并没有COMMIT,在SQL面板2查询到的数据是数据库中的数据(COMMIT前的数据),SQL面板1 COMMIT;之后在SQL面板2中查询的数据一直是SQL面板2中事务中的数据(undo日志)。
祝学习愉快!
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星