Поведение при блокировке в Spanner vs MySQL

Я изучаю возможность переноса приложения, созданного поверх MySQL, в Spanner и не уверен, смогу ли я воспроизвести определенные функции из нашей базы данных MySQL.

в основном упрощенная версия нашей схемы mysql будет выглядеть так

пользователи
id
имя
баланс

user_transactions
id
user_id
external_id
сумма

user_locks
user_id
дата

когда приложение получает транзакцию для пользователя, приложение запускает транзакцию mysql, обновляет user_lock для этого пользователя, проверяет, достаточно ли у пользователя баланса для транзакции, создает новую транзакцию, а затем обновляет баланс. Возможно, приложение получает транзакции для пользователя одновременно, поэтому блокировка заставляет их быть последовательными.

Можно ли повторить это в Spanner? Как мне это сделать? Обычно, если приложение получает две транзакции одновременно, я хочу убедиться, что им дан заказ и что измененные данные из первой транзакции распространяются на вторую транзакцию.


person Tucker Joseph    schedule 27.10.2017    source источник


Ответы (1)


Cloud Spanner будет делать это по умолчанию, поскольку он обеспечивает сериализуемость, что означает, что все транзакции, по-видимому, произошли в последовательном порядке. Подробнее о семантике транзакции можно прочитать здесь: https://cloud.google.com/spanner/docs/transactions#rw_transaction_semantics

person Vikas Kedia    schedule 27.10.2017
comment
Давайте предположим, что последовательно происходит следующее: запуск транзакции A, чтение данных X, запуск транзакции B, чтение данных X, запись данных X, фиксация A. Я хочу убедиться, что чтение транзакции B включает зафиксированные изменения из A, но я не могу сказать из документации, если это так по умолчанию или нет, есть ли способ создать блокировку, которая будет получена в начале транзакции. - person Tucker Joseph; 31.10.2017
comment
Когда вы пытаетесь зафиксировать транзакцию B, она будет прервана, если какие-либо данные, которые она считала, изменились за это время. Затем вам нужно будет повторить попытку B (клиентские библиотеки сделают это автоматически за вас), а затем он прочитает последнее значение X. - person Vikas Kedia; 02.11.2017
comment
Если вы читаете данные в транзакции чтения / записи, она автоматически блокирует возвращаемые строки / столбцы. Обратите внимание: блокируется не вся строка, блокируются только столбцы, возвращаемые запросом. - person kanagaraj palanisamy; 03.11.2017