2012-06-25 5 views
1

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

+0

Мой ответ: Да. Тем не менее, люди на [dba.stackexchange.com] (http://dba.stackexchange.com) лучше подходят для этого. –

ответ

1

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

Это верно даже для одного оператора:

select * from Tab 
except select * from Tab 

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

SQL Server: существует простой способ быстрого, неблокирующего, неблокирующего, последовательного чтения: Включить изоляцию моментальных снимков и прочитать в транзакции моментального снимка. У AFAIK Oracle также есть эта возможность. Postgres тоже.

0

Целью транзакции является откат или фиксация операций, выполняемых с базой данных, если вы просто выбираете значения и не изменяете данные, нет необходимости в транзакции.

+0

Неправильно. Транзакции также могут обеспечивать согласованное представление данных. – usr

+0

@usr Оператор select не должен использовать транзакцию. Совершенно бессмысленно, когда вы совершаете транзакцию, вы ничего не совершаете (поскольку ничего не изменилось), и поэтому вы будете нести накладные расходы на установление транзакции. транзакции просто используются для поддержания достоверных данных. Так что, если вы меняете одну таблицу, и от нее зависит другая таблица, вы не будете обновлять одну таблицу, не обновляя другую. Если второе обновление не выполняется, первое обновление будет возвращено в исходное состояние. Если оба они успешны, вы можете зафиксировать их вместе и обеспечить достоверные данные. Конд. – Zia

+0

Другими словами, вам нужно всего лишь использовать transactiosn при вставке/обновлении/удалении и только при выполнении нескольких операций. – Zia

2

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

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

+0

REPEATABLE READ несовместим с появлением новых строк. – usr

+0

Вы правы. Я исправлю ответ. Благодарю. (В PostgreSQL REPEATABLE READ достаточно, потому что вы получаете изоляцию Snapshot, но это не был вопрос PostgreSQL, поэтому ответ должен дать переносимый ответ.) – kgrittn

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

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