Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Откуда читаются данные при не зафиксированной транзакции?  [new]
смумрик
Guest
сессия А выполняет транзакцию - изменяет строку в таблице внутри БД.
изменения не фиксирует, ожидает чего-то (человек, выполняющий транзакцию
пошёл пить кофе).

сессия Б хочет прочитать данные, которые изменила сессия А.
откуда она будет читать данные?

в Oracle используется табличное пространство Undo.
согласованное чтение производится из этого табличного пространства.

а как в MSSQL?
4 июл 13, 17:53    [14523953]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
super-code
Member

Откуда:
Сообщений: 244
смумрик,

уровни изоляции транзакций?
4 июл 13, 18:06    [14524030]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
смумрик
сессия Б хочет прочитать данные, которые изменила сессия А.
откуда она будет читать данные?
в Oracle используется табличное пространство Undo.

Что-то вы фантазируете. В Oracle нельзя прочитать незакоммиченные данные из другой транзакции.
4 июл 13, 18:07    [14524034]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
Glory
Member

Откуда:
Сообщений: 104760
смумрик
в Oracle используется табличное пространство Undo.
согласованное чтение производится из этого табличного пространства.

Разве вы читате не данные ДО изменения ?
4 июл 13, 18:14    [14524061]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
А если 20 пользователей одновременно поменяли данные по-разному, что что вы вычитаете их их незакомиченных сессий?
4 июл 13, 18:15    [14524068]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гавриленко Сергей Алексеевич
А если 20 пользователей одновременно поменяли данные по-разному

Как такое возможно, если "писатели блокируют писателей"?
4 июл 13, 18:39    [14524193]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
смумрик
Guest
Glory
смумрик
в Oracle используется табличное пространство Undo.
согласованное чтение производится из этого табличного пространства.

Разве вы читате не данные ДО изменения ?

всё верно, ДО изменения. что-то крышу сносит.

откуда будут читать данные ДО изменения?
4 июл 13, 18:40    [14524203]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
смумрик
Guest
автор
Откуда читаются данные при не зафиксированной транзакции?

я имел ввиду: как обеспечивается согласованное чтение в mssql.
4 июл 13, 18:50    [14524244]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
смумрик
я имел ввиду: как обеспечивается согласованное чтение в mssql.


учитывая это

автор
в Oracle используется табличное пространство Undo.


речь идет о версионном режиме работы бд в MS SQL. В этом режиме данные будут читаться из версионного хранилища в tempdb.
4 июл 13, 21:15    [14524646]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
смумрик
Guest
pkarklin
смумрик
я имел ввиду: как обеспечивается согласованное чтение в mssql.


учитывая это

автор
в Oracle используется табличное пространство Undo.


речь идет о версионном режиме работы бд в MS SQL. В этом режиме данные будут читаться из версионного хранилища в tempdb.


а сортировки тоже в Tempdb?

т.е. и сортировки и данные будут читаться из Tempdb?

версионный режим - являеется режимом по умолчанию в mssql?
5 июл 13, 10:41    [14526011]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
Glory
Member

Откуда:
Сообщений: 104760
смумрик
а сортировки тоже в Tempdb?

Какие еще "сортировки" ?

смумрик
версионный режим - являеется режимом по умолчанию в mssql?

Нет
По умолчанию - read committed
5 июл 13, 10:43    [14526025]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
смумрик
Guest
Glory
смумрик
а сортировки тоже в Tempdb?

Какие еще "сортировки" ?

смумрик
версионный режим - являеется режимом по умолчанию в mssql?

Нет
По умолчанию - read committed


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

у меня вопрос а как в MSSQL?

а как обеспечивается согласованность на чтение данные в режиме read commited?
5 июл 13, 11:13    [14526219]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
Glory
Member

Откуда:
Сообщений: 104760
смумрик
у меня вопрос а как в MSSQL?

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

смумрик
а как обеспечивается согласованность на чтение данные в режиме read commited?

Отрыть хелп и прочитать про уровни изоляции.
Или рассказать о том, какую задачу вы пытаетесь решить.
5 июл 13, 11:23    [14526314]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34621
смумрик,

В общем-то то же самое, что в оракеле.
Только МС умеет отключать этот режим.
5 июл 13, 11:34    [14526415]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
смумрик,

Поищите и почитайте: Inside Microsoft® SQL Server™ 2005: The Storage Engine By Kalen Delaney
5 июл 13, 11:36    [14526440]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34621
в oracle сортировка данных осуществляется в памяти, называемой PGA.
...
у меня вопрос а как в MSSQL?


Сортировка осуществляется (если не влазит в память) в tempdb, которая является почти такой же БД,
как и все остальные (и кстати кэшируется).


а как обеспечивается согласованность на чтение данные в режиме read commited?

На уровне изоляции read commited согласованное чтение не обязано существовать,
т.е. не нужно.
5 июл 13, 12:55    [14527094]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
Denis Reznik
Member

Откуда: Киев
Сообщений: 156
смумрик
а как обеспечивается согласованность на чтение данные в режиме read commited?


В SQL Server две concurrency models - оптимистичная и пессимистичная. Пессимистичная пердполагает управление конкурентным доступом к данным с помошью блокировок, и используется по умолчанию. Уровни изоляции этой модели больше или меньше соответствуют требованиям ACID: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ и SERIALIZABLE. По умолчанию используется read committed, он запрещает грязные чтения (чтение не закомиченных данных) путём блокировки: другой процесс, который придёт и захочет поменять эти данные, увидит что на них стоит блокировка и будет ждать пока она не будет отпущена. Но, READ COMMITTED оставляет возможным такие вещи как неповторяемые чтения и фантомные записи, они убираются более жёсткими уровнями изоляции REPEATABLE READ и SERIALIZABLE.
Оптимистичная модель в SQL Server представлена уровнями изляции READ COMMITTED SNAPSHOT и SNAPSHOT, здесь помимо блокировок используется ещё и хранилище версий. Например, используем READ COMMITTED SNAPSHOT, транзакция меняет строку X, приходит другая транзакция, которая хочет прочитать эти данные, и она не ждёт пока пройдёт первая транзакция, а читает данные из хранилища версий из tempdb.
5 июл 13, 13:18    [14527270]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Denis Reznik
READ COMMITTED оставляет возможным такие вещи как неповторяемые чтения и фантомные записи, они убираются более жёсткими уровнями изоляции REPEATABLE READ и SERIALIZABLE
Лучше написать так:
При REPEATABLE READ и SERIALIZABLE такого возникнуть не может.

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

Просто READ COMMITTED в принципе решает любую задачу в идеальном случае (нет кривых рук, неправильных структур и идиотских ограничений), одним запросом.

Denis Reznik
READ COMMITTED SNAPSHOT и SNAPSHOT, здесь помимо блокировок используется ещё и хранилище версий.
Точнее вместо блокировок чтения используется версионность.
Блокировки записи есть всегда, и они одинаковые. Вся канитель (уровни изоляции и стратегии) касается только операций чтения (без намерения).

Есть ещё оптимистическая запись - когда блокировки записи откладываются до момента коммита.
6 июл 13, 01:40    [14530569]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
Denis Reznik
Member

Откуда: Киев
Сообщений: 156
Mnior
А "они убираются" не этими методами, а теми которые воспользует разработчик.
К примеру из двух запросов напишет один. Исправит корявый запрос.

Я здесь объяснил как работают определённые уровни изоляции, то что собственно и спрашивал автор топика. Другие методы выходят за рамки топика и обсуждать их здесь их не вижу смысла.


Mnior
Denis Reznik
READ COMMITTED SNAPSHOT и SNAPSHOT, здесь помимо блокировок используется ещё и хранилище версий.
Точнее вместо блокировок чтения используется версионность.
Блокировки записи есть всегда, и они одинаковые. Вся канитель (уровни изоляции и стратегии) касается только операций чтения (без намерения).

Я стараюсь быть очень аккуратным в выражениях. Поясню. Даже при использовании версионности Shared блокировки остаются в некоторых ситуациях. Пару примеров: проверка внешнего ключа, проверка уникальности по индексу. При уровне изоляции SNAPSHOT блокировки на запись ведут себя тоже не так как в других уровнях изоляции: если стоит эксклюзивная блокировка, то второй процесс, который хочет тоже поставить блокировку не ждёт своей очереди, а просто отваливается с ошибкой.
8 июл 13, 12:55    [14535277]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Denis Reznik
Другие методы выходят за рамки топика и обсуждать их здесь их не вижу смысла.
Как хотите, и я и не настаивал (с дулом у виска) тут что-то обсуждать. Просто я поправил "ваш выход за рамки". Могли и сами за них не выходить.

Denis Reznik
Я стараюсь быть очень аккуратным в выражениях. Поясню.
Хорошо что я начал "поправлять". Ибо такие детали не сразу всплывают.
Denis Reznik
При уровне изоляции SNAPSHOT блокировки на запись ведут себя тоже не так как в других уровнях изоляции: если стоит эксклюзивная блокировка, то второй процесс, который хочет тоже поставить блокировку не ждёт своей очереди, а просто отваливается с ошибкой.
Уточную, при наличии блокировки других процессов - ничего не отваливается, а ждёт, как и обычно.
Отваливается не из-за блокировки, а при наличии не последней версии изменяемой строки в рамках текущей транзакции. Перед попыткой наложить локировку намерения (U).
Msg 3960, Level 16, State 2
Транзакция в режиме изоляции моментального снимка прервана из-за конфликта обновлений.
Невозможно использовать режим изоляции моментального снимка для прямого или косвенного доступа к таблице "dbo.Test" в базе данных "TestDB" для обновления, удаления или вставки строки, которая изменена или удалена другой транзакцией.
Повторите транзакцию или измените уровень изоляции для инструкции обновления или удаления.

Тут нельзя говорить что один ведут себя "не так". Ибо в других уровнях "версия записи" всегда "последняя". ;)
Denis Reznik
Даже при использовании версионности Shared блокировки остаются в некоторых ситуациях. Пару примеров: проверка внешнего ключа, проверка уникальности по индексу.
Очень важное замечание!
И хорошо бы ссылку на BOL.
8 июл 13, 21:12    [14538549]     Ответить | Цитировать Сообщить модератору
 Re: Откуда читаются данные при не зафиксированной транзакции?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Mnior
Denis Reznik
Даже при использовании версионности Shared блокировки остаются в некоторых ситуациях. Пару примеров: проверка внешнего ключа, проверка уникальности по индексу.
Очень важное замечание!
Это для меня.

А вообще опять-таки, уровни изоляции транзакций это для чтения. И READ COMMITTED SNAPSHOT и SNAPSHOT не накладывают локировки. И shared тоже.

Надо лишь помнить что блокировки намерения и записи (U, X) на момент наложения дополнительно могут накладывать сами по себе и локировки S на ключи. Но с самим чтением это никак не связано.
8 июл 13, 22:51    [14538764]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить