Поведение транзакций MySQL / PHP - PullRequest
4 голосов
/ 18 января 2010

Дано:

mysql_query("START TRANSACTION");
mysql_query("UPDATE foo = 'bar'");
die();

die() останавливает транзакцию, прежде чем я смогу COMMIT или ROLLBACK. Глядя на мои таблицы, выясняется, что обновление не происходит, но если я выполню запросы позже в другом сценарии, они все еще будут частью этой первоначальной транзакции? Является ли транзакция открытой до тех пор, пока я COMMIT или ROLLBACK?

Ответы [ 2 ]

4 голосов
/ 18 января 2010

Если die уничтожает соединение с mysql, тогда да, транзакция закрывается. Если вы просто оставляете транзакцию зависшей, у вас могут возникнуть проблемы.

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

1 голос
/ 18 января 2010

Это зависит от вашего уровня сериализации. Если транзакция не зафиксирована и не откатана, через некоторое время она должна завершиться и откатиться в БД. Но до тех пор это незавершенная транзакция, которая может привести к несогласованным выборам в других несериализуемых транзакциях. Зависит от уровня :

  • читать незафиксированные: вы можете прочитать незавершенные, незавершенные значения до отката
  • повторяемое чтение (mysql по умолчанию): вы не будете читать неподтвержденные значения, но, поскольку диапазоны не заблокированы, SELECT COUNT (*) ОТ клиентов, ГДЕ 18
...