在不开启自动提交的时候,用户对数据库的修改仅对自己可见,直到 commit 提交结果,或 rollback 撤回结果。commit 的结果无法 rollback,反之同理。
有一个例外,一些对表结构的操作(创建修改表结构,以及对索引的操作),会使得在操作之前自动 commit 提交事务,执行完再次 commit,使得这些操作是不可被撤销的。
网上对于这个实验只有答案,没有解释,来解释一下答案的来源。
序号 | 窗口 | 题号 | 执行语句 | 结果/解释 |
---|---|---|---|---|
1 | 备用窗口 | update test8_00 set age=88 |
当前用户可见 88,其他人不可见 | |
2 | 备用窗口 | 结果 1 | select * from test8_00 |
88 |
3 | 备用窗口 | commit |
提交成功,其他成员可见 88 | |
4 | 备用窗口 | rollback |
该语句紧跟在 commit 后面无效 | |
5 | 备用窗口 | update test8_00 set age=age+1 |
当前用户可见 89,其他人为 88 | |
6 | 备用窗口 | rollback |
回滚成功,所有成员可见 88 | |
7 | 备用窗口 | commit |
该语句紧跟在 rollback 后面无效 | |
8 | 备用窗口 | update test8_00 set age=age+2 |
当前用户可见 90,其他人为 88 | |
9 | 备用窗口 | commit |
提交成功,其他成员可见 90 | |
10 | 备用窗口 | 结果 2 | select * from test8_00 |
90 |
11 | 备用窗口 | rollback |
回滚查询语句对数据存储没有影响 | |
12 | 主窗口 | 结果 3 | select * from userb.test8_00 |
90 |
13 | 备用窗口 | update test8_00 set age=age-2 |
当前用户可见 88,其他人为 90 | |
14 | 备用窗口 | update test8_00 set age=age-2 |
当前用户可见 86,其他人为 90 | |
15 | 备用窗口 | 结果 4 | select * from test8_00 |
86 |
16 | 主窗口 | 结果 5 | select * from userb.test8_00 |
90 |
17 | 主窗口 | commit |
提交查询语句对数据存储没有影响 | |
18 | 主窗口 | 结果 6 | select * from userb.test8_00 |
90 |
19 | 主窗口 | rollback |
回滚查询语句对数据存储没有影响 | |
20 | 主窗口 | update userb.test8_00 set age=age-10 |
卡死,等待备用窗口提交或回滚后执行 | |
21 | 备用窗口 | 结果 7 | select * from test8_00 |
86 |
22 | 备用窗口 | create table test8_01 as select * from test8_00 |
建表前提交之前事务,解冻主窗口,主 76 其他 86 | |
23 | 备用窗口 | rollback |
创建表无法回滚 | |
24 | 备用窗口 | 结果 8 | select * from userb.test8_00 |
86 |
25 | 主窗口 | 结果 9 | select * from userb.test8_00 |
76 |
26 | 主窗口 | rollback |
所有用户回归 86 | |
27 | 主窗口 | 结果 10 | select * from userb.test8_00 |
86 |