|
|
|
способы борьбы с блокировками ASE-12_5
|
|||
|---|---|---|---|
|
#18+
Всем доброго дня. Вот такая проблема: ASE-12_5_4 Есть две связанные таблицы - динамические справочники, отношение многие ко многим. По ним ведется интенсивная конкурентная работа (запись/чтение), зачастую транзакции оказываются достаточно длинными. В результате частые блокировки со всеми вытекающими... Прекрасно понимаю, что ситуация почти хрестоматийная, но способы борьбы с блокировками, которые приходят в голову -- - отказ от кластерных первичных ключей; - отказ от внешних ключей; - установка блокировок на уровне строки; - логическое фрагментирование (например, по дате); - кэширование на уровне именованных кэшей -- выглядят как полумеры. Может, после/перед праздниками голова не варит? :: Кто-то может посоветевать что-то более радикальное? Вплоть до изменения модели? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2008, 16:24 |
|
||
|
способы борьбы с блокировками ASE-12_5
|
|||
|---|---|---|---|
|
#18+
А ваша бизнес логика допускает грязное чтение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2008, 16:08 |
|
||
|
способы борьбы с блокировками ASE-12_5
|
|||
|---|---|---|---|
|
#18+
Я ещё подумал - насколько должны быть синхронизированны чтение и изменение справочников? Может быть имеет смысл отделить изменения от чтения, т.е. собирать изменения за определённые промежутки времени в отдельную таблицу и потом разом их в одной транзакции накатывать. Сделать интервал между накатами, скажем в 5 минут. Можно было бы даже на моменты наката при помощи логики подвесить пишущие транзакции, например добавить while @read_flag = 0 begin select @read_flag = read flag from sync_table end перед Вашими большими читающими транзакциями. Ну и соответственно накатывающая транзакция будет перед началом работы ставить @read_flag в 0. На уровне пользователя вносящего изменения получится что-то "Ваши изменения буду добавлены через 5 минут". Мне часто доводилось видеть подобные сообщения, я думаю что и вам. На уровне читающего пользователя будут небольшие тормоза раз в 5 минут, может быть он их даже и не заметит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2008, 16:31 |
|
||
|
способы борьбы с блокировками ASE-12_5
|
|||
|---|---|---|---|
|
#18+
KruА ваша бизнес логика допускает грязное чтение? Да, допускает, уже. Там УЖЕ сейчас при чтении накладывается условие по таймстамп. ::)) ::(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2008, 17:51 |
|
||
|
способы борьбы с блокировками ASE-12_5
|
|||
|---|---|---|---|
|
#18+
KruЯ ещё подумал - насколько должны быть синхронизированны чтение и изменение справочников? Может быть имеет смысл отделить изменения от чтения, т.е. собирать изменения за определённые промежутки времени в отдельную таблицу и потом разом их в одной транзакции накатывать. Сделать интервал между накатами, скажем в 5 минут. Можно было бы даже на моменты наката при помощи логики подвесить пишущие транзакции, например добавить while @read_flag = 0 begin select @read_flag = read flag from sync_table end перед Вашими большими читающими транзакциями. Ну и соответственно накатывающая транзакция будет перед началом работы ставить @read_flag в 0. На уровне пользователя вносящего изменения получится что-то "Ваши изменения буду добавлены через 5 минут". Мне часто доводилось видеть подобные сообщения, я думаю что и вам. На уровне читающего пользователя будут небольшие тормоза раз в 5 минут, может быть он их даже и не заметит. Видимо, что-то в этом роде и придется сделать. Только, боюсь, придется выдержать серьезную схватку с пользователями, они-то уже привыкли к другому. М-да, оборотная сторона быстро растущего бизнеса. Нет бы заранее репу почесать. P.S. Большое спасибо, что откликнулись... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2008, 17:56 |
|
||
|
способы борьбы с блокировками ASE-12_5
|
|||
|---|---|---|---|
|
#18+
shmmax KruА ваша бизнес логика допускает грязное чтение? Да, допускает, уже. Там УЖЕ сейчас при чтении накладывается условие по таймстамп. ::)) ::(( Я так понял, что чтение выполняется по таймеру, так что при следующем прочтении результаты могут быть совсем другими. Если так, то попробуйте в транзации уровень изоляции грязное чтение поставить. Блокировок вообще не будет и производительность соответственно от них страдать тоже не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2008, 19:01 |
|
||
|
способы борьбы с блокировками ASE-12_5
|
|||
|---|---|---|---|
|
#18+
shmmax KruЯ ещё подумал - насколько должны быть синхронизированны чтение и изменение справочников? Может быть имеет смысл отделить изменения от чтения, т.е. собирать изменения за определённые промежутки времени в отдельную таблицу и потом разом их в одной транзакции накатывать. Сделать интервал между накатами, скажем в 5 минут. Можно было бы даже на моменты наката при помощи логики подвесить пишущие транзакции, например добавить while @read_flag = 0 begin select @read_flag = read flag from sync_table end перед Вашими большими читающими транзакциями. Ну и соответственно накатывающая транзакция будет перед началом работы ставить @read_flag в 0. На уровне пользователя вносящего изменения получится что-то "Ваши изменения буду добавлены через 5 минут". Мне часто доводилось видеть подобные сообщения, я думаю что и вам. На уровне читающего пользователя будут небольшие тормоза раз в 5 минут, может быть он их даже и не заметит. Видимо, что-то в этом роде и придется сделать. Только, боюсь, придется выдержать серьезную схватку с пользователями, они-то уже привыкли к другому. М-да, оборотная сторона быстро растущего бизнеса. Нет бы заранее репу почесать. P.S. Большое спасибо, что откликнулись... По поводу схватки с пользователями - если у Вас процедуры из-за блокировок виснут, то пользователи скорее всего привыкли видеть шевелящийся курсор на экране. Я думаю, что интервал можно вообще 1 минуту поставить. Может быть даже и нескольких секунд хватит. Здесь нужно будет определять на ощуить - меньше интервал - меньше изменений - быстрее синхронизация. Но может быть Вам просто удастся грязным чтением отделаться и не нужно будет ничего усложнять. Удачи. PS: Напишите чем дело закончится. Интересно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2008, 19:09 |
|
||
|
способы борьбы с блокировками ASE-12_5
|
|||
|---|---|---|---|
|
#18+
shmmax пишет: > - установка блокировок на уровне строки; Вот это вам поможет. И это не полумеры, а кординальное решение. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2008, 13:30 |
|
||
|
способы борьбы с блокировками ASE-12_5
|
|||
|---|---|---|---|
|
#18+
Ура! Проблему решили путем изменения схемы блокировки + логический разрыв транзакции. Т.е., данные для связанной таблицы сначала помещаются в #tab, а затем отдельным процессом батчами заливаются собственно в справочник. Сейчас работает даже без семафоров. P.S. Спасибо Kru и MasterZiv за участие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2008, 14:13 |
|
||
|
способы борьбы с блокировками ASE-12_5
|
|||
|---|---|---|---|
|
#18+
MasterZiv shmmax пишет: > - установка блокировок на уровне строки; Вот это вам поможет. И это не полумеры, а кординальное решение. Posted via ActualForum NNTP Server 1.4 только надо помнить, что при этом таблица будет расти быстрее (формат страницы меняется) и нагрузка на сервер СУБД будет больше, чем при APL схеме (накладные расходы на обслуживание DOL схемы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2008, 15:33 |
|
||
|
способы борьбы с блокировками ASE-12_5
|
|||
|---|---|---|---|
|
#18+
shmmax пишет: > Проблему решили путем изменения схемы блокировки + /_логический_/ разрыв > транзакции. > P.S. Спасибо Kru и MasterZiv за участие. О! "Одно мое слово спасло Францию !" Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2008, 15:39 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=35048625&tid=2011742]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
179ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 227ms |
| total: | 515ms |

| 0 / 0 |
