赞
踩
第一步,建account(账户)表,属性有id(编号)和balance(金额) 。
第二步:
(1)在原窗口调整隔离级别为read uncommitted。
(2)打开新窗口,调整隔离级别为read uncommitted(未提交读)。
第三步:
(1)原窗口开启事务。
(2)新窗口开启事务。
第四步:
(1)原窗口事务1查询account表。
(2)新窗口事务2更新1号账户的钱,将钱加200,更新到1200。
(3)在原窗口事务1验证,理论上read uncommitted(未提交读)模式下,虽然事务2未提交,但事务1可以读到事务1的更新值。结果验证如下,符合理论预期:
第五步:
(1)在窗口2中回滚:事务2的更新操作。
(2)在窗口1中重新查询account表,理论上在事务2回滚后,事务1中查询会得到事务2回滚后的表。
结果验证如下,符合结果预期:
第一步:
在之前的基础上,将事务2改为read committed(读已提交)模式。
第二步:
(1)在事务1中,更新账户1,将钱减两百,得800。
理论上事务2此时,已经只能看到其他事务已经提交的修改,所有事务1的减操作,事务2看不到,所以在事务2中查询,账户1的钱仍然是1000。
(2)在事务2中验证如下,符合结果预期:事务2只能看到其他事务已提交的内容,事务1尚未提交,因此在事务2中的账户1的钱仍然是1000。
第三步:
(1)在事务1中提交之前的账户1更新操作。
理论上事务1提交操作后,事务2能看的到。所有再在事务2中查询,预期账户1的钱已变为800。
(2)在事务2中重新查询account表。
得到账户1的钱已经变为800,符合预期。
第一步:
(1)在之前的基础上,将事务2改为repeatable(可重复读)模式。
(2)在事务2中开启事务。
(3)在事务2中查询一次account表。
使用select * from account;
理论上事务2目前处于可重复读模式,无论其他事务怎么修改account表,后面再次执行该查询语句,结果应该和这次的一样。
(2)第二步:
(1)在事务1中插入账户3,初始的钱为1000。
(2)在事务1使用select * from account;
查询结果中出现了新增的账户记录。
第三步:
(1)返回事务2验证:
在事务2中使用select * from account;
事务2中的查询结果,没有事务1中新增的记录,成功验证:
在同一事务和可重复读模式下,无论其他事务怎么修改,原事务中执行相同的查询语句,前后结果相同。
第四步:
二道验证,看事务1是否将之前新的记录插成功:
在事务2中尝试插入账户3,钱为1000。
运行结果表示:id为3的插入冲突,说明id为3的账户记录已经存在,也就是事务1的插入成功。
该结果再次证明可重复读模式的功能,结论在上面的第三步。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。