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 Read、SELECT ... LOCK IN SHARE MODE
或者SELECT ... FOR UPDATE
(假设你用的是MySQL5.7, MySQL 8.0)
中的语法会略有不同
我在 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 Read、SELECT ... LOCK IN SHARE MODE
或者SELECT ... FOR UPDATE
(假设你用的是MySQL5.7, MySQL 8.0)