Подтвердить что ты не робот

Какой смысл заключать в транзакции команды select?

Какой смысл заключать команды select в транзакции? Я думаю, что операторы select - это просто данные GET из базы данных, у них нет возможности откатить что-то, потому что вы просто не можете изменить данные. Итак, это значит, что нам никогда не нужно вводить предложения select в транзакции? Я прав?

Спасибо.

4b9b3361

Ответ 1

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

connection 1:                          connection 2:

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

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

Если вам нужно repeatable reads, то обертывание в транзакции по умолчанию не помогает:

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 запрос отчета останавливает любую активность обновления.

Ответ 2

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

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

Ответ 3

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

Ответ 4

Нет.

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

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

Ответ 5

Возможно, вы не изменяете данные, но какое-то другое соединение с базой данных может.

Ответ 6

Другая причина использования транзакций с выбором:

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

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

Ответ 7

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