Нужна ли транзакция для присоединенного запроса? - PullRequest
3 голосов
/ 30 марта 2012

Нужно ли использовать транзакции в SQL-запросах с объединениями?

Я думал о чем-то вроде:

Delete table1, table2, table3 
FROM table1 INNER JOIN table2 ON(...) 
LEFT JOIN table3 ON (...) 
WHERE table1.column = something...

(я не знаю, правильный ли синтаксис на 100%, но я думаю, что вы все равно это понимаете)

Есть ли риск, что не все строки, которые должны быть удалены, не будут удалены?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 30 марта 2012

Я не думаю, что с помощью транзакции можно что-либо сделать. Один запрос в большинстве случаев является атомарным, и он выполняется в одной транзакции.Что касается запросов к серверу MS-SQL, таких как массовая вставка без журналов и усечение, могут потребоваться транзакции.В вашем случае вам не нужен перевод вокруг вашего оператора удаления.Если существует несколько операторов, вам нужно заключить их в одну транзакцию, чтобы все или ни одно из них не было выполнено. Проверьте этот вопрос

4 голосов
/ 30 марта 2012

Нет, вам не нужна транзакция.В результате транзакции несколько операторов выполняются как единое целое;Выполнение одного оператора в транзакции или за ее пределами всегда будет приводить к одинаковым результатам.

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

4 голосов
/ 30 марта 2012

Поскольку это одна команда (DELETE), нет необходимости явно использовать транзакцию.Команды SQL являются атомарными по определению, то есть либо удаляют все строки, которые соответствуют критерию, либо вообще не удаляют их при наличии ошибки.

РЕДАКТИРОВАТЬ: этот ответ верен в теории и для баз данных, которые поддерживают ACID,Если базы данных не поддерживают атомарность или имеются ошибки, которые вызывают некорректное поведение со стороны ядра базы данных, все ставки отключены.Однако маловероятно, что использование транзакций волшебным образом улучшит ситуацию в этих сценариях.

1 голос
/ 30 марта 2012

Для любого оператора INSERT, UPDATE, SELECT, DELETE явные команды транзакции отсутствуют, и ядро ​​базы данных откатит весь оператор в случае ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...