DBMS中的冲突可以定义为两个或更多个不同的事务访问相同的变量,其中至少一个是写操作。
例如:
T1: Read(X)
T2: Read (X)
在这种情况下,没有冲突,因为两个事务都只执行读取操作。
但在以下情况下:
T1: Read(X)
T2: Write(X)
有一个冲突。
假设我们有一个调度S
,我们可以重新排序其中的指令,并创建另外两个调度S1
和S2
。
冲突等价: 指维持冲突指令顺序的S1
和S2
调度。例如,如果T1
在S1
中必须在T2
写入X
之前读取X
,那么S2
中也应该是这样。(只有冲突操作的顺序需要维护)
冲突可串行化: 如果S
与一个串行调度(即按顺序一个接一个执行事务)是冲突等价的,则称S
是冲突可串行的。
来源:维基百科
如果满足以下条件,则称调度S1
和S2
具有冲突等价性:
调度S1
和S2
都涉及相同的事务集(包括每个事务内部的操作顺序)。
S1
和S2
中每一对冲突操作的顺序相同。
当调度与一个或多个串行调度具有冲突等价性时,则称该调度为冲突可串行化。
另一种定义冲突可串行化的方法是,当只考虑已提交的事务时,其优先级图/可串行性图是无环的(如果将未提交的事务也包括在内,则可能会出现涉及未提交事务的循环而不违反冲突串行性)。
只有两个术语来描述同一件事情的不同方式。
冲突等价:你需要说日程表A与日程表B是冲突等价的。它必须涉及到两个日程表。
冲突可串行化:仍然使用日程表A和B。我们可以说日程表A是冲突可串行化的。日程表B也是冲突可串行化的。
我们没有说日程表A/B是冲突等价的。
我们没有说日程表A与日程表B是冲突可串行化的。
如果一个调度S可以通过一系列非冲突指令的交换被转化为一个调度S´,我们称S和S´是冲突等价的。
如果一个调度S与一个串行调度具有冲突等价性,我们称S是冲突可串行化的。
如果考虑的事务调度存在至少一个与之冲突等价的调度,则它是冲突可串行化的。