Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE 12.5 Блокировка таблицы / 10 сообщений из 10, страница 1 из 1
04.11.2008, 15:34
    #35633480
cherrex_Den
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASE 12.5 Блокировка таблицы
Есть таблица. Надо перелить данные в другую аналогичную таблицу и создать триггер, который бы после заливки выполнял бы синхронизацию данных. С переливкой и триггером проблем нет, но таблица часто изменяемая (много update и insert) и есть вероятность, что не все данные перельются. Как полностью заблокировать таблицу пока происходит переливка данных и создание триггера? Таблица имеет построчную схему блокировки, а пользователи работают на уровне изоляции транзакции 1.


И еще маленький вопрос: Как в триггере (если он вызывается при update и insert) определить какая команда его вызвала? Можно конечно разнести по двум отдельным триггерам или проверять таблицу deleted на наличие строк, но может, есть более простой способ (через глобальную переменную, например).
...
Рейтинг: 0 / 0
04.11.2008, 18:45
    #35633716
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASE 12.5 Блокировка таблицы
cherrex_Den пишет:

> Есть таблица. Надо перелить данные в другую аналогичную таблицу и
> создать триггер, который бы после заливки выполнял бы синхронизацию
> данных. С переливкой и триггером проблем нет, но таблица часто
> изменяемая (много update и insert) и есть вероятность, что не все данные
> перельются. Как полностью заблокировать таблицу пока происходит
> переливка данных и создание триггера? Таблица имеет построчную схему
> блокировки, а пользователи работают на уровне изоляции транзакции 1.

begin transaction
lock table MYTABLE

....

commit/rollback

Но lock table действует только в транзакции и до конца данной транзакции.


> двум отдельным триггерам или проверять таблицу deleted на наличие строк,
> но может, есть более простой способ (через глобальную переменную, например).

Это вот не знаю.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
04.11.2008, 19:08
    #35633741
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASE 12.5 Блокировка таблицы
можно еще во время переливки использовать более высокий уровень изоляции - serializable.
Why CORBA is DEAD?
...
Рейтинг: 0 / 0
05.11.2008, 08:55
    #35634147
cherrex_Den
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASE 12.5 Блокировка таблицы
MasterZivbegin transaction
lock table MYTABLE

а "create trigger" можно использовать в транзакции?

Ggg_oldможно еще во время переливки использовать более высокий уровень изоляции - serializable.

а serializable избавит меня от инсертов которые не блокируют таблицу с построчной схемой блокировки?
...
Рейтинг: 0 / 0
05.11.2008, 13:20
    #35634861
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASE 12.5 Блокировка таблицы
Ggg_old wrote:

> можно еще во время переливки использовать более высокий уровень изоляции
> - serializable.
1) Это тоже в транзакции (одной) надо делать.
2) Результат отнюдь не гарантирован.

так что lock table.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
05.11.2008, 13:24
    #35634877
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASE 12.5 Блокировка таблицы
cherrex_Den wrote:

> а "create trigger" можно использовать в транзакции?
>

В многостейтментной транзакции создать триггер ?
Думаю, вряд ли.
Но его можно и до транзакции создать.

> Ggg_old
> можно еще во время переливки использовать более высокий уровень изоляции
> - serializable.
>
>
>
> а serializable избавит меня от инсертов которые не блокируют таблицу с
> построчной схемой блокировки?

Вы не слушайте про serializable, ещё раз, serializable вам НИЧЕГО НЕ
БУДЕТ ГАРАНТИРОВАТЬ. Нет, он конечно будет гарантировать, что эта
транзакция с другими будет выполнена так, как если бы она выполнялась
строго последовательно, но вся загвоздка имено в этом "БЫ".
Короче, lock table ничем не хуже поднятия уровня изоляции, но
гарантированно даёт ясный и понятный результат - он захватит таблицу
и до конца этой транзакции только эта транзакция сможет с таблицей работать.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
05.11.2008, 15:30
    #35635305
cherrex_Den
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASE 12.5 Блокировка таблицы
Сделал! Алгоритм такой:
1. открываем две сессии.
2. в первой сесси открываем транзакцию и блокируем таблицу("lock table dbo.test_lock in exclusive mode").
3. создаем тригер во второй сессии (create trigger...).
4. выполняем переливку (insert into...select...) в первой сессии и тойже транзакции что и "lock table dbo.test_lock in exclusive mode".
5. закрываем транзакцию в первой сессии(commit).

Всем спасибо!
...
Рейтинг: 0 / 0
05.11.2008, 15:57
    #35635394
cherrex_Den
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASE 12.5 Блокировка таблицы
Нет! Рано обрадовался!
Если между блокировкой таблицы и создание триггера кто-то еще допустим что-то инсертит, то "create trigger" ждет пока этот инсерт закончиться. А это значит что инсертовые записи не попадут во вторую таблицу при переливки!
...
Рейтинг: 0 / 0
05.11.2008, 16:37
    #35635500
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASE 12.5 Блокировка таблицы
1) Включаешь триггер.
2) insert into table2 select * from table1 where not exists (select * from table2)
Если в table1 есть автоинкрементное поле или поле типа timestamp, то можно добавить условие - меньше 1-ой обработанной триггером записи.
...
Рейтинг: 0 / 0
06.11.2008, 09:12
    #35636536
cherrex_Den
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASE 12.5 Блокировка таблицы
golsa1) Включаешь триггер.
2) insert into table2 select * from table1 where not exists (select * from table2)
Если в table1 есть автоинкрементное поле или поле типа timestamp, то можно добавить условие - меньше 1-ой обработанной триггером записи.

так как тригер срабатывает не только на инсерты , но и на апдэйты, его надо делать после переливки(если произойдет update, то тригеру нучего апдэйтить будет). Ладно, прийдется перевести базу в "single user", чтоб быть абсолютно уверенным.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE 12.5 Блокировка таблицы / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]