自定义sql锁方案的并发安全性

qyzbxkaa  于 2021-07-29  发布在  Java
关注(0)|答案(0)|浏览(176)

我有以下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。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题