mysql - 如何防止 SELECT 在另一个事务完成之前读取表
问题描述
事情就是这样。我需要在表中插入一行,但前提是行数小于 10。
通常我会这样做:
SELECT COUNT(*) FROM mytable WHERE cDate = '2019-01-01'
;- 检查返回值是否小于10。如果不是,那么我需要向用户返回一条消息。
- 如果小于 10。我愿意
INSERT INTO mytable (cDate) VALUE ('2019-01-01')
。
现在这是在服务器上运行,表有 9 行。因此,如果在我检查行数时,另一个用户进行相同的检查,它将再次返回 9 行(因为尚未发生 INSERT)。这将导致两次插入,总共有 11 行,其中允许的最大值为 10。
我怎样才能防止这种情况发生?
解决方案
你可以使用双重:
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')
推荐阅读
- java - 手动将@Entity 转换为投影界面
- node.js - axios post socket 仅在 docker 中挂断
- testng - 并行运行 citrusframework 测试用例
- etl - 数据仓库层中的代理键有什么好处?
- powershell - 使用 Powershell 启用或禁用组策略
- css - CSS - 向左浮动使 Div 消失
- javascript - 使用存储的函数打印变量会产生 [Function],这是什么意思?
- php - 如何显示 meta_box 的内容?
- java - 如何检查给定 JVM 标志的值?
- reactjs - 如何从我的项目中删除大多数 index.ts 文件