Какой смысл заключать операторы выбора в транзакцию? - PullRequest
28 голосов
/ 23 июня 2010

Какой смысл заключать операторы выбора в транзакцию? Я думаю, что операторы select - это просто «ПОЛУЧЕНИЕ» данных из базы данных, у них нет шансов откатить что-то, потому что вы просто не можете изменить данные. Итак, значит ли это, что нам никогда не нужно помещать операторы select в транзакцию? Я прав?

Спасибо.

Ответы [ 7 ]

32 голосов
/ 23 июня 2010

Вы правы: при стандартном уровне изоляции , read committed вам не нужно заключать операторы выбора в транзакции. Операторы выбора будут защищены от грязного чтения, независимо от того, заключите вы их в транзакцию или нет.

connection 1:                          connection 2:

                                       begin transaction
                                       update user set name = 'Bill' where id = 1
select name from users where id = 1
                                       rollback transaction

Оператор выбора не будет читать откатное обновление: не имеет значения, что они не включены в транзакцию.

Если вам нужно повторяющихся чтений , то перенос по умолчанию в транзакции по умолчанию не помогает:

connection 1:                          connection 2:

begin transaction
select name from users where id = 1
                                       update user set name = 'Bill' where id = 1
select name from users where id = 1
commit transaction

Здесь не помогут операторы begin и commit: второй select может прочитать старое имя или может прочитать новое имя.

Однако, если вы используете более высокий уровень изоляции, например serializable или repeatable read, группа будет защищена от неповторяющихся чтений:

connection 1:                          connection 2:

set transaction isolation level
    repeatable read
begin transaction
select name from users where id = 1
                                       update user set name = 'Bill' where id = 1
select name from users where id = 1              |
commit transaction                               |
                                                 |--> executed here

В этом сценарии update будет блокироваться до завершения первой транзакции.

Более высокие уровни изоляции используются редко, поскольку они уменьшают количество людей, которые могут работать в базе данных одновременно. На самом высоком уровне, serializable, отчетный запрос останавливает любую операцию обновления.

7 голосов
/ 23 июня 2010

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

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

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

5 голосов
/ 23 июня 2010

Одна инструкция SELECT является атомарной для начала - ее включение в транзакцию является избыточным. Если имеется несколько операторов SELECT, вам гарантировано, что никто не изменил ничего, что повлияло бы на какое-либо из них, пока все они не будут выполнены.

3 голосов
/ 23 июня 2010

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

3 голосов
/ 23 июня 2010

номер

Транзакция дает вам согласованное представление о базе данных.

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

2 голосов
/ 25 июня 2010

Еще одна причина использовать транзакции с выбором:

Возможно, что в какой-то момент вы захотите вызвать свой метод select из других методов, участвующих в транзакции, и вы хотите, чтобы метод select участвовал в текущей транзакции. Если у вас есть согласованный дизайн, в котором все действия с базой данных выполняются в транзакции, то вызывающие стороны любого метода знают, что он будет участвовать в их транзакции.

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

0 голосов
/ 23 июня 2010

Если вы уверены, что все, что происходит, это SELECT, то это не обязательно должно быть в транзакции. Вы на 100% уверены, что сейчас и навсегда это будет просто ВЫБОР?

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