Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
Господа такой вопрос по блокировкам и уровням изоляции: создаю таблицу и наполняю её create table test_block (id int) go insert into test_block values (1) insert into test_block values (2) insert into test_block values (3) insert into test_block values (4) go создаю 2ю таблицу create table tt (id int) в 1й сессии эксклюзивно блокирую test_block begin transaction lock table test_block in exclusive mode select * from test_block во 2й сессии читаю из неё с грязным чтением set transaction isolation level read uncommitted begin tran select * from test_block commit Всё работает, запрос возвращает данные Пробую сделать вставку грязных данных в таблицу tt set transaction isolation level read uncommitted begin tran insert into tt select * from test_block commit Всё виснет - грязное чтение не работает Главный вопрос - что insert into не поддерживает грязное чтение? И ещё такой дополнительный вопрос: set transaction isolation level read uncommitted begin tran select * from test_block commit работает begin transaction select * from test_block at isolation read uncommitted commit требует уникального индекса. Один и тот же запрос - по сути, но почему 2й синтаксис требует уникального индекса? Всем заранее спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 20:04 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
Kru пишет: > Пробую сделать вставку грязных данных в таблицу tt > > set transaction isolation level read uncommitted > begin tran > insert into tt > select * from test_block > commit > Всё виснет - грязное чтение не работает > > Главный вопрос - что insert into не поддерживает грязное чтение? Дело в том, что грязное чтение - это ТОЛЬКО грязное чтение. Но не грязная запись. На самом деле уровни изоляций у транзакций такие (от самого "слабого" к "сильным"): dirty write dirty read read committed spapshot isolation и repeatable read (два уровня, схожих по "силе") serializable Это не по ANSI, это по Грею et al, где они выступали с критикой стандарта. "Минимальный" dirty read не является на самом деле логически минимальным, но dirty write ни одна СУБД делать не позволяет, поскольку это явно порождает wormhole и просто не дает возможность реализовать durability транзакций. Т.е. это просто физически невозможно в любой транзакционной системе. Вам бы тут хотелось именно грязной записи, но ее не существует в природе. Так что то, чего вы хотите, никогда работать не будет. Если рассмотреть это не с точки зрения теории, а с точки зрения реализации ASE, то lock table накладывает X Table lock до конца транзакции. SELECT на read uncommitted читает данные вообще без локов (без транзакционных локов), поэтому это возможно - прочитать таким select-ом данные из залоченной таблицы. UPDATE накладывает блокировки X Row, X Page или X Table (в зависимости от ситуаций), и ни одна из них не совместима с другим X Table lock, т.е. залоченную таблицу в другой транзакции изменять нельзя. А, извините, у вас там INSERT был, ну он накладывает X ROW или X PAGE, или иногда даже X Table, ситуация та же. Вам надо подумать о другом сценарии взаимодействия ваших транзакций. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 21:23 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
Kru пишет: > И ещё такой дополнительный вопрос: > > set transaction isolation level read uncommitted > begin tran > select * from test_block > commit > работает > > begin transaction > select * from test_block at isolation read uncommitted > commit > требует уникального индекса. > Один и тот же запрос - по сути, но почему 2й синтаксис требует > уникального индекса? Вообще говоря, оба должны требовать уникального индекса. Но там требование не жесткое. Блин, вообще, Kru, дался вам этот read uncommitted ? Я думаю все нормальные люди уже давно про него и думать забыли, с тех пор как появился LOCK SCHEME DATAROWS. Вы LOCK DATAROWS лучше юзайте, эффект почти тот же, а проблем почти никаких. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 21:26 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
MasterZiv Kru пишет: > И ещё такой дополнительный вопрос: > > set transaction isolation level read uncommitted > begin tran > select * from test_block > commit > работает > > begin transaction > select * from test_block at isolation read uncommitted > commit > требует уникального индекса. > Один и тот же запрос - по сути, но почему 2й синтаксис требует > уникального индекса? Вообще говоря, оба должны требовать уникального индекса. Но там требование не жесткое. Блин, вообще, Kru, дался вам этот read uncommitted ? Я думаю все нормальные люди уже давно про него и думать забыли, с тех пор как появился LOCK SCHEME DATAROWS. Вы LOCK DATAROWS лучше юзайте, эффект почти тот же, а проблем почти никаких. Posted via ActualForum NNTP Server 1.4 Просто любопытно стало почему одна и таже операция по разному написанная в одном случае работает, а в другом нет. И зачем уникальный индекс для грязного чтения. Почему без него нельзя. В жизни я грязным чтением не пользуюсь, но теоретически интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 21:59 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
MasterZiv Kru пишет: Дело в том, что грязное чтение - это ТОЛЬКО грязное чтение. Но не грязная запись. На самом деле уровни изоляций у транзакций такие (от самого "слабого" к "сильным"): dirty write dirty read read committed spapshot isolation и repeatable read (два уровня, схожих по "силе") serializable Это не по ANSI, это по Грею et al, где они выступали с критикой стандарта. "Минимальный" dirty read не является на самом деле логически минимальным, но dirty write ни одна СУБД делать не позволяет, поскольку это явно порождает wormhole и просто не дает возможность реализовать durability транзакций. Т.е. это просто физически невозможно в любой транзакционной системе. Вам бы тут хотелось именно грязной записи, но ее не существует в природе. Так что то, чего вы хотите, никогда работать не будет. Если рассмотреть это не с точки зрения теории, а с точки зрения реализации ASE, то lock table накладывает X Table lock до конца транзакции. SELECT на read uncommitted читает данные вообще без локов (без транзакционных локов), поэтому это возможно - прочитать таким select-ом данные из залоченной таблицы. UPDATE накладывает блокировки X Row, X Page или X Table (в зависимости от ситуаций), и ни одна из них не совместима с другим X Table lock, т.е. залоченную таблицу в другой транзакции изменять нельзя. А, извините, у вас там INSERT был, ну он накладывает X ROW или X PAGE, или иногда даже X Table, ситуация та же. Вам надо подумать о другом сценарии взаимодействия ваших транзакций. Posted via ActualForum NNTP Server 1.4 У нас один из пользователей решил написать процедуру которая могла бы работать параллельно с reorg. Расчёт был на то, что если использовать dirty reading, то не будет никаких блокировок и соответственно проблем. И ему бы это удалось если бы он просто селектил записи. Но т.к. пользователь захотел сохранить результаты выборки во временной таблице, то у него ничего и не получилось. В общем понятно, что работу reorg надо планировать правильно, тогда и проблем не будет, но! родился теоретический вопрос - почему нельзя сохранить результаты грязного чтения? Замечу, что insert выполняется в другую таблицу и блокировки здесь кажется не при чём. А вот то что Вы про идеологию написали MasterZiv "Минимальный" dirty read не является на самом деле логически минимальным, но dirty write ни одна СУБД делать не позволяет, поскольку это явно порождает wormhole и просто не дает возможность реализовать durability транзакций. Т.е. это просто физически невозможно в любой транзакционной системе. звучит довольно интересно. Трудно представить задачу, где-бы требовалось сохранение куда-то ещё грязных данных. Но если бы такая задача возникла бы, то кажется, что по определению она бы не имела решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2007, 22:14 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
Kru пишет: > У нас один из пользователей решил написать процедуру которая могла бы > работать параллельно с reorg. Так любая может же ... я не понял. Если не reorg rebuild, то все on-line. > dirty reading, то не будет никаких блокировок и соответственно проблем. > И ему бы это удалось если бы он просто селектил записи. Но т.к. > пользователь захотел сохранить результаты выборки во временной таблице, > то у него ничего и не получилось. Странно, должно было получиться. На таблицу в tempdb-то блокировка не наложена. > родился теоретический вопрос - почему нельзя сохранить результаты > грязного чтения? Можно, почему же нельзя -то ? > звучит довольно интересно. Трудно представить задачу, где-бы требовалось > сохранение куда-то ещё грязных данных. Ой, слушайте, я вам все не то написал. Я что-то уже не осознал что вставка в другую таблицу идет. так все должно по идее работать, если не работает, вам нужно просто посмотреть, кто кого блокирует и почему (sp_lock) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 01:32 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
простой тест и результаты: Session 1 begin transaction lock table test_block in exclusive mode locktype /table_id Ex_table-blk/ 465162640 Session 2 set transaction isolation level read uncommitted begin tran select * from test_block commit no locks set transaction isolation level read uncommitted begin tran insert into tt select * from test_block commit locktype / table_id Sh_intent-request /465162640 Видно, что при insert (даже в совершенно другую таблицу) сервер пытается перед чтением записей установить shared блокировку. Другими словами он игнорирует установку read uncommitted. Вопрос почему он так себя ведёт? Может действительно "грязная" запись запрещена идеологией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 18:34 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
>> И ещё такой дополнительный вопрос: >> set transaction isolation level read uncommitted >> begin tran >> select * from test_block >> commit >> работает >> begin transaction >> select * from test_block at isolation read uncommitted >> commit >> требует уникального индекса. >> Один и тот же запрос - по сути, но почему 2й синтаксис требует уникального индекса? Оба случая требуют уникального индекса. Я просто по отдельности запускал в артизане сначала begin tran и потом уже select. Если их запустить вместе, то сервер ругнётся и потребует индекса. Этот вопрос закрываю, т.к. вопроса собственно больше и нет :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2007, 18:40 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
Kru wrote: > Видно, что при insert (даже в совершенно другую таблицу) сервер пытается > перед чтением записей установить shared блокировку. На таблицу, которую он читает для инсерта, так ? Другими словами он > игнорирует установку read uncommitted. А попробуй select * into #tt from test_block at isolation level read uncommitted > Вопрос почему он так себя ведёт? Может действительно "грязная" запись > запрещена идеологией. Запрещена-то она запрещена, в этом сомнения быть не может. Но здесь-то эта таблица только читается. Ну не знаю. А можно вопрос - чем вообще -то REORG мешает ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2007, 14:27 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
MasterZiv Kru wrote: > Видно, что при insert (даже в совершенно другую таблицу) сервер пытается > перед чтением записей установить shared блокировку. На таблицу, которую он читает для инсерта, так ? Другими словами он > игнорирует установку read uncommitted. А попробуй select * into #tt from test_block at isolation level read uncommitted > Вопрос почему он так себя ведёт? Может действительно "грязная" запись > запрещена идеологией. Запрещена-то она запрещена, в этом сомнения быть не может. Но здесь-то эта таблица только читается. Ну не знаю. А можно вопрос - чем вообще -то REORG мешает ? Posted via ActualForum NNTP Server 1.4 Попробовал и так select * into #tt from test_block at isolation read uncommitted -- Error: Number (7375) SELECT INTO cannot be specified with isolation level clause. и вот так insert into tt select * from test_block at isolation read uncommitted и даже так : -) insert into tt select a.* from (select * from test_block at isolation read uncommitted) a --Error: Number (7377) SELECT INSERT cannot be specified with isolation level clause. Нашел на буржуйском форуме похожий вопрос, но там тоже нет ответа, зато узнал оттуда, что на MSSQL так делать можно. Значит идеология не причём. Цитата из форума 2002 года. "What I'd like to be able to do is something with this equivalent in SQL Server 2000: select distinct fieldname into #temp from tablename with (readpast) Sybase version is 11.9.2." Может в Sybase написать? Есть готовая репромодель (они так называют скрипт воспроизводящий багафичи) Народ! Есть кто-нибудь подписанный на сайбезовскую техподдержку? Может напишите? Раньше, за обнаружение "хорошей" багафичи дарили игрушечный грузовичок с логотипом Sybase через весь кузов. Не шучу. В руках держал : -))) По поводу reorg - скорее всего выполняется reorg rebuild, поэтому и таблица эксклюзивно блокируется. Я думаю, что не трудно будет разнести по времени процедуру и reorg, но вопросик то остался : -) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2007, 17:31 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
Проверяем : dbcc traceon(3604,1211) set transaction isolation level 0 select * from test2 -- ПУСТО -- select * into test3 from test2 LOCK STRATEGY FOR INSERT db=4 obj=64000228 (test2) lock=shared intent stat=0x0 Что подтверждает что и на 0 уровне изоляции требуется shared блокировка при select insert или select into. В свое время уже была дискусия между разработчиками ASE, касательно того, нужно ли накладывать shared блокировку в таком случае. Даже был открыт CR # 133560 Title: Allow dirty reads of read-only tables refd in select-into or insert-select stmts Но он был закрыт Closure Code: Not a Bug Т.к. согласно SQL92 требуется такая блокировка SQL-92 recognizes that the execution of queries is dependant on the metadata of the tables involved, and requires that access to such metadata must be serializable, even if the level of isolation for the data is set to a lower level of isolation ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2007, 18:56 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
moris wrote: Согласен, что штука не очень нужная, но однако > Т.к. согласно SQL92 требуется такая блокировка > > SQL-92 recognizes that the execution of > queries is dependant on the metadata of the tables involved, and requires > that access to such metadata must be serializable, even if the level of > isolation for the data is set to a lower level of isolation из этого не следует, что надо накладывать блокировку на саму таблицу. Можно наложить строчную блокировку на строку в sysobjects. Но sysobjects у нас - LOCK ALL PAGES, только в последнее время перевелись системные таблицы на DATAROWS. Так что вот и понятно, откуда ноги фичи растут. Вместо того, чтобы делать SHARED LOCK на страницу в sysobjects они (SI) предпочли делать SHARED TABLE на саму таблицу, поскольку такая блокировка меньше кому мешает. (SHARED LOCK на странице sysobjects мог бы мешать изменениям других таблиц, чьи строки лежали бы на этой же странице). Кстити можно предположить, что и в MSSQLServer не так все хорошо с этим, потому что как у них там что блокируется, никто не знает, все на откуп решениям сервера. Так что вполне может быть что это будет когда работать, а когда и нет. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2007, 21:24 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
А интересно на ASE15 тоже такое поведение будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2007, 22:37 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
По поводу, того чтобы сделать shared row lock на sysobjects - это в принципе имеет смысл...Может для этого и будет открыт FeatureRequest В ASE15 все как раньше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2007, 11:19 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
В общем, нельзя напрямую сделать select..into или insert..select. Я вчера, кстати нашел ответ супер гуру Rob Verschoor, тот самый который Tips, Tricks & Recipes for Sybase ASE написал: http://www.dbforums.com/archive/index.php/t-743460.html . Он тоже говорит что так нельзя и идеологически это обосновано. Ну если уж очень хочется записать грязные данные то можно сделать вот так, через курсор. На курсор сервер позволяет утановить уровень изоляции isolation read uncommitted. declare c_test cursor for select * from test_block at isolation read uncommitted go declare @i int open c_test fetch c_test into @i while @@sqlstatus =0 begin insert into tt values (@i) fetch c_test into @i end close c_test go deallocate cursor c_test go ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2007, 17:18 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
У меня вопросов больше нет. Всем огромное спасибо! Наверное есть один вопрос - всё-таки интересно - есть ли реальные задачи, не связанные с ошибками в расписании как в моём случае : -)), требующие сохранения "грязных" данных. Кто-инбудь видел что - нибудь подобное? В голову лезут детективные фантазии о службе безопасности отлавливающей тёмных личностей, которые уже почти выполнили преступную транзакцию, но вдруг их что-то насторожило и они решили на этот раз сделать rollback : -)))) Ну это уже наверное вопрос не к Sybase форуму :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2007, 17:56 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
Kru wrote: > Наверное есть один вопрос - всё-таки интересно - есть ли реальные > задачи, не связанные с ошибками в расписании как в моём случае : -)), > требующие сохранения "грязных" данных. Так вы и не ответили в конце концов, ЗАЧЕМ же вам такое извращение понадобилось. Потому что вроде бы как REORG может выполняться on-line, не мешая пользователям (правда, не все его комманды). Я за всю свою достаточно длительную карьеру работал с грязным чтением только еще на MSSQL, 6.5. После перехода на ASE не использовали мы в свойе, достаточно объемной, разработке грязное чтение никогда. Изначально поводом для этого послужило наличие "проблемы" в ASE необходимости присутствия уникального индкса в таблице для возможности ее грязного чтения, а потом, при появлении DOL таблиц, уже просто в связи с отсутствием необходимости. Кстати на MSSQL 6.5, насколько я помню, грязное чтение не требовало уникального индекса - если что не так, оно просто тупо завершалось ошибкой. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2007, 12:02 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
С появлением DOL таблиц также пропала и необходимость в наличии уникального индекса для грязного чтения. Трудно назвать проблемой в ASE Performance & TuninigIf the table uses allpages locking, a unique index is required to perform an isolation level 0 read, unless the database is read-only. The index is required to restart the scan if an update by another process changes the query’s result set by modifying the current row or page. Forcing the query to use a table scan or a non unique index can lead to problems if there is significant update activity on the underlying table, and is not recommended. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2007, 16:11 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
MasterZiv Kru wrote: > Наверное есть один вопрос - всё-таки интересно - есть ли реальные > задачи, не связанные с ошибками в расписании как в моём случае : -)), > требующие сохранения "грязных" данных. Так вы и не ответили в конце концов, ЗАЧЕМ же вам такое извращение понадобилось. Потому что вроде бы как REORG может выполняться on-line, не мешая пользователям (правда, не все его комманды). Извращение понадобилось одному из разработчиков чью процедуру выполняли во время работы reorg rebuild. Последний эксклюзивно блокирует таблицы т.к. rebuild. В общем первопричина - организационная ошибка. Почему-то решили, что проще будет отделаться грязным чтением, чем менять расписание. Удалось убедить, что не надо создавать лишние сложности и что единственно правильное решение это поправить расписание. Ну а дальше просто любопытно стало почему сервер себя так ведёт. Вот собственно как топик и появился :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2007, 18:26 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
Kru wrote: > Извращение понадобилось одному из разработчиков чью процедуру выполняли > во время работы reorg rebuild. Последний эксклюзивно блокирует таблицы > т.к. rebuild. Так пускали бы RECLAIM SPACE , COMPACT вместо этого. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2007, 02:20 |
|
||
|
ASE 12.5 locks and isolation levels
|
|||
|---|---|---|---|
|
#18+
MasterZiv Kru wrote: > Извращение понадобилось одному из разработчиков чью процедуру выполняли > во время работы reorg rebuild. Последний эксклюзивно блокирует таблицы > т.к. rebuild. Так пускали бы RECLAIM SPACE , COMPACT вместо этого. Posted via ActualForum NNTP Server 1.4 Проблему решили изменением времени запуска процедуры. Огромное спасибо за ответы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2007, 19:40 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=35011102&tid=2011759]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 257ms |
| total: | 417ms |

| 0 / 0 |
