【问题标题】:Locking and concurrency with MySQLMySQL的锁定和并发
【发布时间】:2015-12-24 03:24:56
【问题描述】:

我目前正在为所有表使用带有 InnoDB 存储引擎的 Mysql。

所以,我想知道这是否是一个真正的问题,是否有解决方案。

例如,我将使用数据库事务向用户收费: 1.查看他的余额 2.减去他的余额 3.将此余额记入某处 4. 提交

如果更新发生在 #1 之后和 2 和 3 之前会发生什么。如果用户撤回或购买其他东西导致他的余额为零。这将导致失去这种平衡。据我了解,第 1 步只会导致共享锁,不会阻塞写入等。

有没有通用的解决方案?

【问题讨论】:

标签: mysql database transactions locking innodb


【解决方案1】:

您的标签表明您了解答案是什么——锁定。关系数据库(通常)实现事务的 ACID 属性,从而确保数据的一致性。实际上,出于性能原因,这些有时会放宽,但大多数数据库都提供了一些方法来实现这一目标。

在 MySQL 中,锁定机制取决于底层存储引擎。 InnoDB 提供了几个选项,在documentation 中进行了描述。

要实现这些锁定,您基本上有两个带有SELECT 的语法选项:

select . . . for update
select . . . lock in share mode

请注意,这些语句应在显式事务中使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多