【问题标题】:Locking Behavior In Spanner vs MySQLSpanner 与 MySQL 中的锁定行为
【发布时间】:2017-10-27 15:12:16
【问题描述】:

我正在探索将基于 MySQL 构建的应用程序迁移到 Spanner 中,但不确定是否可以从我们的 MySQL 数据库中复制某些功能。

基本上,我们的 mysql 架构的简化版本如下所示

用户
id
姓名
余额

user_transactions
id
user_id
external_id金额

user_locks
user_id
日期

当应用程序接收到用户的交易时,应用程序启动 mysql 交易,更新该用户的 user_lock,检查用户是否有足够的交易余额,创建新交易,然后更新余额。应用程序可能会同时接收用户的事务,因此锁会强制它们是顺序的。

是否可以在 Spanner 中复制它?我该怎么做?基本上,如果应用程序同时接收到两个事务,我想确保给它们一个订单,并且将第一个事务的更改数据传播到第二个事务。

【问题讨论】:

    标签: google-cloud-platform google-cloud-spanner


    【解决方案1】:

    Cloud Spanner 默认会执行此操作,因为它提供可序列化性,这意味着所有事务似乎都以串行顺序发生。您可以在此处阅读有关事务语义的更多信息: https://cloud.google.com/spanner/docs/transactions#rw_transaction_semantics

    【讨论】:

    • 假设依次发生以下情况:启动事务 A,读取数据 X,启动事务 B,读取数据 X,写入数据 X,提交 A。我想确保事务 B 的读取包括已提交的更改来自 A,但我无法从文档中判断默认情况下是否是这种情况,或者如果不是,是否有某种方法可以创建在事务开始时获取的锁。
    • 当您尝试提交事务 B 时,如果它读取的任何数据同时发生更改,它将被中止。然后您需要重试 B(客户端库会自动为您执行此操作),然后它将读取 X 的最新值。
    • 如果您在读/写事务中读取数据,它会自动锁定返回的行/列。注意,不是整行都被锁定,只有查询返回的列被锁定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2023-03-28
    • 2011-05-12
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多