脏读,不可重复读,丢失更新
这是我在上Transaction这节课的时候,发现以上对于基础概念解释的不同。这节课实际上就相当于数据库上面的事务系统,国内一般是在数据库后面讲的。但由于并不像SQL语言那样直观,并且程序员并不需要直接操作,这个机制是数据库管理系统负责的。所以一般也不会有很深的印象。我开始感觉困惑,现在仔细梳理一下把答案写下来。
例子
\(P\)是一系列过程,数字下标1,2,3可以理解成不同的事务,可以理解成不同的进程。\(w,r\)表示读写操作,\(c\)表示对应事务的提交, \(a,b,c\)表示不同的数据。 \[ P = r_1(a); r_2(c); r2(b); w_1(a); r_3(a); r_1(b); w_2(c); w_2(b); c_2; r_3(b); r_3(c); c_3; w_1(b); c_1 \]
名词定义
在以上例子中,脏读,不可重复读,丢失更新对应的具体事件是什么?
我们首先要知道他们三者的定义。那好
- 脏读(lectures sales),可以理解成不同进程先写后读同一个区域\(w_n(x)\dots r_m(x)\)
- 不可重复读(lectures uniques),不同进程先读后写同一个区域\(r_n(x)\dots w_m(x)\)
- 丢失更新(modifications perdues),不同进程先写后写同一个区域\(w_n(x)\dots w_m(x)\)
那好从时间来看,有先后之分,从操作来看有读写之分。所以一共就有四种组合。三以上已经有三种了,还剩下一种不同进程先读后读同一个区域,就相当于一个区域被不同进程看了两遍,这显然是不会造成任何冲突的。也就是说除了不同进程的两次读取之外,其余三种都会造成错误。这与我们的设想是一致的。以上三种冲突实际上就是,对于同一区域读写操作所有可能造成的冲突类型。