2016-08-22 2 views
0

Скажем, у меня был сделка купли-продажи делает что-то вроде этого:Будут ли эти две транзакции sql взаимоблокировками? (/ Resolve с 1 откатом)

START TRANSACTION; 
UPDATE `USER` SET `Money` = `Money - '100'; 
UPDATE `ITEMS` SET `Item` = `Item` + '1'; 
COMMIT; 

И, к сожалению, в то же время хроны бежали, давая проценты на всяких существующем баланс:

UPDATE `USER` SET `Money` = `Money` + '50'; 

(либо завернутый в транзакцию, либо только один автокоммит)

Это может вызвать тупик в любом случае? (Что может быть разрешено откатом одного на dbms)

Любая помощь будет принята с благодарностью, спасибо.

+0

В зависимости от того, какие dbms вы используете. – jarlh

+0

InnoDB/MySQL, но что бы сделать один тупик dbms другим другим? –

+0

Некоторые dbms никогда не запираются. (Например, https://en.wikipedia.org/wiki/Optimistic_concurrency_control) – jarlh

ответ

1

Тупик требует:

  • две различные операции
  • , где каждый из этих двух уже держит некоторые блокировки
  • и где каждый из этих двух, нуждаются в еще один один
  • (и который нужен другой, уже удерживается другой транзакцией).

Теоретически это может произойти в вашем сценарии, если ваши блокировки находятся не на всей таблице (но более мелкозернистые), и если стратегии доступа для обновления таблицы USERS отличаются (обработка физических страниц таблицы в другой порядок). В этом случае было бы странно странно, но, несмотря на это, никогда не стоит зависеть от предполагаемого внутреннего поведения обработки запросов.

 Смежные вопросы

  • Нет связанных вопросов^_^