SQL.RU
 client/server technologies
 
 Главная | Документация | Статьи | Книги | Форум | Опросы | Рассылка | Работа | Поиск | FAQ |

Добро пожаловать в форум, Guest  >>  Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик  Ответить
 SEQUENCE и транзакции   [new]
Анонимус
Guest
Будет ли CURRVAL последовательности постоянным внутри транзакции (если я не выбираю NEXTVAL внутри этой транзакции, но делаю это в других транзакциях). Если да, то какой минимальный уровень изоляции должен быть?
12 сен 08, 15:19    [6179386] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
Анонимус
Guest
Первый вопрос снят, провёл эксперемент. Действительно currval возвращает одно значение вне зависимости от того, что происходит в других транзакциях.
Но вопрос с уровнем изоляции остаётся открытым. Боюсь, что это поведение может сломаться если я буду использовать слишком низкий уровень изоляции, а в программе, в которой я эксперементирую я не могу это проверить.
12 сен 08, 15:40    [6179542] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
Пережареный петух
Guest
Анонимус
Боюсь, что это поведение может сломаться


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

Анонимус
слишком низкий уровень изоляции


Слишком низкий - это какой ? :)
12 сен 08, 15:48    [6179614] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
Анонимус
Guest
>>механизм предмета боязни

Спасибо за о#########ю ссылку!
>>After a statement in a user's session generates a sequence number, the particular sequence number is available only to that session.
и есть ответ на мой первый вопрос (я сам не ораклист, поэтому не судити строго если вопрос был глупым).

>>Слишком низкий - это какой ? :)

Ну read сommited например (я так понимаю read-only это тот же read сommited только с боку).
Если бы я, например, сделал подобие sequence руками, используя таблицу с одной записью, и использовал бы увеличение значения этой записи вместо nextVal и чтение вместо currval то на уровне read сommited у меня бы происходили non-repeatable reads (не знаю как правильно по русски) и всё бы сломалось.
Но я правильно понял, что sequence на любом уровне изоляции правильно работает?
12 сен 08, 16:05    [6179761] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
expla
Guest
curval не читает счётчик последовательности, поэтом уровень изоляции его не бодает. curval возвращает значение переменной определённой на уровне сессии. Эта переменная изменяется функцией nextval. А вот nextval уже читает и изменяет счётчик последовательности, причём делает это в автономной транзакции.
12 сен 08, 16:16    [6179831] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
Пережареный петух
Guest
Анонимус
Ну read сommited например (я так понимаю read-only это тот же read сommited только с боку).


read committed - это уровень ПО УМОЛЧАНИЮ. Ничего "ниже" Oracle не поддерживает.
И read only - это не read committed "сбоку", читайте внимательно.

Анонимус

Если бы я, например, сделал подобие sequence руками, используя таблицу с одной записью


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

Но я правильно понял, что sequence на любом уровне изоляции правильно работает?


Странно было бы, если бы было наоборот.

Одним словом - начните с внимательного чтения концепций и поиска по форуму.
Тут это обсуждалось 1E+10 раз.
12 сен 08, 16:22    [6179873] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
semirax
Member

Откуда:
Сообщений: 393
Добавлю пару слов:

1) уровень изолированности serializable или read only НЕ означает, что внутри одной и той же транзакции один и тот же запрос select дает всегда одно и то же. Хотя бы потому что план оптимизатора внутри одной и той же транзакции для одного и того же запроса может меняться, влияя на результат.

2)oracle для отдельных блоков все-таки поддерживает чтение типа read uncommited. Например при работе со словарем. (См столбец "current" в любом отчете tkprof).

3)Все действия с sequence oracle производит в виде "неявных" автономных транзакций. Но даже на максимальном уровне изолированности их изменения видны, и в этом их отличие от обычных автономных транзакций. То есть, полностью эмулировать работу sequence собственными силами не получится.
12 сен 08, 17:20    [6180144] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
Пережареный петух
Guest
semirax
Добавлю пару слов...


Лучше бы помолчал
12 сен 08, 17:36    [6180203] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
Ну дает...
Guest
semirax
1) уровень изолированности serializable или read only НЕ означает, что внутри одной и той же транзакции один и тот же запрос select дает всегда одно и то же. Хотя бы потому что план оптимизатора внутри одной и той же транзакции для одного и того же запроса может меняться, влияя на результат.

2)oracle для отдельных блоков все-таки поддерживает чтение типа read uncommited. Например при работе со словарем. (См столбец "current" в любом отчете tkprof).

...


Где траву брал, брателло ?
12 сен 08, 17:39    [6180224] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
pravednik
Member

Откуда: Киев
Сообщений: 11578
автор
Хотя бы потому что план оптимизатора внутри одной и той же транзакции для одного и того же запроса может меняться, влияя на результат.

можете подтвердить ?
12 сен 08, 17:43    [6180250] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
Elic
Member

Откуда: Минск
Сообщений: 20557
pravednik
автор
Хотя бы потому что план оптимизатора внутри одной и той же транзакции для одного и того же запроса может меняться, влияя на результат.
можете подтвердить ?
alter session :)
12 сен 08, 17:45    [6180258] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
pravednik
Member

Откуда: Киев
Сообщений: 11578
Elic
pravednik
автор
Хотя бы потому что план оптимизатора внутри одной и той же транзакции для одного и того же запроса может меняться, влияя на результат.
можете подтвердить ?
alter session :)

....влияя на результат ??????
12 сен 08, 17:47    [6180272] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
Elic
Member

Откуда: Минск
Сообщений: 20557
pravednik
....влияя на результат ??????
Нууу...
order by some_indexed_char_col) where rownum = 1
Типа отмазка :)
12 сен 08, 18:04    [6180378] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
Анонимус
Guest
Пережареный петух
И read only - это не read committed "сбоку", читайте внимательно.


>>Read-only transactions see only those changes that were committed at the time the transaction began and do not allow INSERT, UPDATE, and DELETE statements

Таки serializable. "at the time the transaction began" не заметил, мелким шрифтом было написано :))

Пережареный петух

...тогда бы ни одна другая транзакция не смогла бы произвести "nextval" вплоть до завершения
вашей транзакции, если только вы бы не использовали автономную транзакцию для
генерации последовательности.


Эм... ну если бы я туда чего-нибудь записал то так бы оно наверно и было, но это уже особенность реализации конкретной (версии) СУБД, сам по себе read commited ничего подобного не гарантирует и полагаться на такое поведение не совсем корректно. Для устойчивого чтения строки должен быть минимум repeatable read.

Пережареный петух

Странно было бы, если бы было наоборот.


Не странно только то, что явно указано в документации, ко всему остальному слова "странно" и "очевидно" мало применимы ;). Я в документации явных заявлений на эту тему не нашел, проверить у меня возможности не было, поэтому и полез на форум.

Пережареный петух

Тут это обсуждалось 1E+10 раз.


Ога, теперь вижу. Я просто слово "SEQUENCE" в поиске неправильно набрал, поэтому и не нашел ничего. Но зато повеселились :)

semirax

уровень изолированности serializable или read only НЕ означает, что внутри одной и той же транзакции один и тот же запрос select дает всегда одно и то же


Фигасе?!! Барин шутит??
13 сен 08, 17:03    [6181689] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
expla
Guest
Анонимус

semirax

уровень изолированности serializable или read only НЕ означает, что внутри одной и той же транзакции один и тот же запрос select дает всегда одно и то же


Фигасе?!! Барин шутит??


Ну наверное можно найти случаи, когда результат запроса не повторяется вточности. Для read only у меня здраввой фантазии не хватает. А вот serializable допускает изменение данных в транзакции между запросами, вот эти изменения и могут отразиться на результатах запроса.
13 сен 08, 22:41    [6182099] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
semirax
Member

Откуда:
Сообщений: 393
Анонимус

semirax

уровень изолированности serializable или read only НЕ означает, что внутри одной и той же транзакции один и тот же запрос select дает всегда одно и то же

Фигасе?!! Барин шутит??


Пример тут, извиняюсь что приходится повторяться:

http://www.sql.ru/forum/actualthread.aspx?tid=593916#6171347

Суть примера: один и тот же запрос вида select count(*), сделанный внутри транзакции уровня read only, дает разный ответ, поскольку между первым и вторым запросом второй пользователь в своей сессии изменяет настройки оптимизатора через alter system set query_rewrite_integrity=trusted
14 сен 08, 03:56    [6182327] Ответить | Цитировать    Сообщить модератору

 Re: SEQUENCE и транзакции   [new]
Анонимус
Guest
expla
А вот serializable допускает изменение данных в транзакции между запросами


Я не это имел ввиду. Свои изменения на serializable мы видеть должны, чужие нет.

semirax
Пример тут


Прочитал. Больше похоже на баг или на хак (смотря что имели ввиду разработчики oracle когда разрешали делать query_rewrite_integrity=trusted). Вообще serializable по определению должен изолировать транзакцию от влияния других транзакций, если он этого не делает, то это повод звонить в техподдержку.
15 сен 08, 09:24    [6183823] Ответить | Цитировать    Сообщить модератору

Все форумы / Oracle Ответить
Generated time: 156ms.
Rambler's Top100 Powered by ActualForum 1.5.3 [s1] Copyright (c) Alex Sibilev 2000-2010