我有以下sql表,称为mytable:
--------------------------------------------------
| ID | ReaderIn | WriterIn | .. Other columns .. |
--------------------------------------------------
| .. | ... | ... | ...... |
--------------------------------------------------
现在,客户机a(reader)执行以下操作
do {
Update MyTable Set ReaderIn=1 WHERE WriterIn=0 AND ID=1
} while (NumberOfAffectedRows == 0)
// Important Note: NumberOfAffectedRows returns the number of matched rows, i.e. those for which the where
// conditions were satisfied, not the number of rows actually updated
// Enter critical path..
客户端b(一个编写器)执行以下操作
Update MyTable Set WriterIn=1 Where ID=1
do {
Select ReaderIn As Locked From MyTable Where ID=1
} while (Locked == 1)
// Enter critical path
作为一种解释,客户机b(writer)将writerin设置为1,使它的存在性为已知,这样将来的读者就可以继续在循环中旋转而不进入关键路径(因为writerin=1,所以numberofaffectedrows将为0)。现在b将等待在她之前到达的任何可能的读者结束他们的工作,这样她就可以接手了。假设在b到达之前进入其关键路径的读卡器,在所有读卡器都完成时,会以某种方式将readerin设置为0。
现在我担心的是,a和b是否有可能同时进入它们的关键路径。例如,如果a首先到达并看到writerin值为0,但b的速度足够快,可以将writerin设置为1,读取readerin值为0,然后a才能将其设置为1。有可能吗?
不要为并发作者操心。
如果有关系,我的数据库服务器是mariadb-10.4.10。
暂无答案!
目前还没有任何答案,快来回答吧!