加锁要注意的地方-脏读

加锁要注意整体性,比如现在正在给一个参数进行setValue,可能setValue的方法耗时比较长,这时候又有一个线程去getValue去了,这个时候就会有问题,所以set和get都要加锁。

加锁要注意的地方-脏读_第1张图片

加锁要注意的地方-脏读_第2张图片

Oracle的一个示例

比如现在有一个用户A在9:00查看一张很大的表,查询到最后一条数据dataLast=100需要十分钟,这时候有一个用户B在9:05分修改了dataLast=200,这个时候A用户查看datagLast任然是100。Oracle有一个Undo的概念,当Oracle进行DML操作的时候,会先把原先的数据放到Undo里面,然后再进行修改,如果update失败,会根据Undo的数据进行回滚。

在9:00用户A看数据的时候,如果Oracle发现数据的undo有变化了,Oracle就会到Undo里面去找老值100,如果找到了就返回100,找不到就会报错(宁可报错也不会返回200)snapShot too old异常。找不到的可能就比如A在查找的过程中出现了一些并发的修改。在9点看到的肯定是9点的数据。

你可能感兴趣的:(加锁要注意的地方-脏读)