根据我所理解的,不可重复读是指在一个事务中对同一数据进行多次读取时,由于其他事务对该数据进行了更新,导致事务中多次读取的结果不一致;而可重复读就是即使其他事务对该数据进行了更新,该读事务多次读取的结果也是一致的。
这样的话我就有疑惑了:数据本身就被更新了,为什么还要保证多次读取的结果一致?这也只是表面上看上去一致的呀,实际都已经改变了,相反我个人还觉得不可重复读能够及时反映数据的变化,似乎更合理一些?那么可重复读的意义在哪呢?或者说不可重复读会有什么后果呢?
另外,还有个小问题:一个事务对数据进行了修改,但是还没有提交,那么这次修改是否真的生效了呢?虽然通过隔离级别能够设置为读已提交,但是我个人觉得隔离级别只是针对于一个事务而言的,而不会影响数据库本身,那么对于数据库本身来说,此次未提交的修改是否生效呢?
对于这个问题,我结合了一下其他的资料,说一下我的理解:关闭事务自动提交,事务开启后,会将事务开启前的数据信息保存在undo日志里面,事务执行中对数据的所有操作实际上都已经体现在数据库中了,即使没有提交,数据在数据库中也已经生效,这样说来,事务语句最后输入的commit只有表示事务结束的意思,真正的提交已经伴随着事务执行发生了,如果最终输入的是rollback,就会通过undo日志来将数据库中的被修改的数据恢复到初始状态,从而实现“回滚”。
不知道我的这种理解是否正确呢?望不吝赐教,十分感谢!
不可重复读很容易让人陷入一个思维定式那就是 我干嘛需要多次读取一个值 还要保证一致
要跳出这个思维看本质:我在事务中会不会受到其他事务的影响
举个简单的例子 数据校对(只是举个例子体现意思 不用太在意具体的业务)
我要取当前的余额 当前的账单 上个月的余额 我要检验一下数据对不对
我在事务中取了当前的账单和上个月的余额,好嘛,这时候又有新的订单提交了,我再获取余额是不是就不一致了?