首页 > 解决方案 > 如何防止 SELECT 在另一个事务完成之前读取表

问题描述

事情就是这样。我需要在表中插入一行,但前提是行数小于 10。

通常我会这样做:

  1. SELECT COUNT(*) FROM mytable WHERE cDate = '2019-01-01';
  2. 检查返回值是否小于10。如果不是,那么我需要向用户返回一条消息。
  3. 如果小于 10。我愿意INSERT INTO mytable (cDate) VALUE ('2019-01-01')

现在这是在服务器上运行,表有 9 行。因此,如果在我检查行数时,另一个用户进行相同的检查,它将再次返回 9 行(因为尚未发生 INSERT)。这将导致两次插入,总共有 11 行,其中允许的最大值为 10。

我怎样才能防止这种情况发生?

标签: mysql

解决方案


你可以使用双重:

INSERT INTO tReservations (cClass, cFecha, cDNI) SELECT '12','2019-11-13','30913307' FROM DUAL WHERE 12 > (SELECT COUNT(*) AS cnt FROM tReservations WHERE cFecha ='2019-11-13' AND cClass = '12')

推荐阅读