MySql 并并行执行来自更多用户的书面命令

MySql and parallel execution of command in writing from more users

我在 Mysql 中有 InnoDB tables,我会知道当我执行 UPDATE 我的数据库是否自动保证锁定。

我进一步澄清这个概念: 我对数据库有多个并发访问,即场景是我有更多用户同时以书面形式访问 table 的相同记录。例如修改可用 T 恤数量的更新(2 个用户同时减少此数量)。 Sql 数据库保证更新查询(和其他查询)和记录锁定(或 table)的原子性? (因为如果可以“安排”更新查询,您可能会得到错误的结果)。

如果内置行为不能让我放心,您如何设置它以确保串行执行?

Innodb 将在执行写入时自动获取锁sql(如更新、删除或锁定读取),您可以查看 MySQL 文档 Locks Set by Different SQL Statements in InnoDB 了解更多详细信息

此外,MySQL 支持原子更新(通过锁定),但实际结果基于您的 sql。在你的情况下,下面的 sql 可以确保即使多个线程并发执行也能得到预期的最终结果

UPDATE table_xxx SET t_shirts_count = t_shirts_count + 1 
WHERE ...

但是这个不是(select-increment-update)即使更新本身是原子的,但是整个过程不是原子的

SELECT t_shirts_count FROM table_xxx WHERE ...

-- increment `t_shirts_count` in application code (not in DB)

UPDATE table_xxx set t_shirts_count = new_t_shirts_count WHERE...

对了,如果上面的原子更新不满足你,试试Locking ReadSELECT ... LOCK IN SHARE MODE或者SELECT ... FOR UPDATE(假设你用的是MySQL5.7, MySQL 8.0)

中的语法会略有不同