Всем привет.
Все наверное знают, что для сереализации неких процедур (или потоков)
используются мютексы, семафоры, критические секции и т.д.
Не секрет, что таковые действия иногда бывают необходимы и в СУБД при много
пользовательских обработках. С блокировочниками всё
понятно (у них
Что-то типа такого подойдет?
while Gen_Id(LockGen,0) = 1 do
begin
end;
Select Gen_Id(LockGen,1) from rdb$database
Тута работаем...
...
Select Gen_Id(LockGen,-1) from rdb$database
when any
Select Gen_Id(LockGen,-Gen_Id(LockGen,0)) from rdb$database
Что-то типа такого подойдет?
Спасибо, примерно что-то вроде этого (только с квадратными колёсами) недавно
изобретал.:)
А насколько часто приходится использовать такие вещи в реальных задачах?
Какие минусы проявляются при подобных подходах?
(Например ясно, что любой может безнаказанно сделать
sw wrote:
понятно (у них по-другому если и получается, то не очень). В версионной
архитектуре не минусов блокирующего подхода.
Но для реализации например псевдо-SERIALIZEBLE изоляции (например хотябы для
агрегатов) наверное был бы полезен мютексы
поддерживаемые на уровне СУБД.
Серилизация делается очень просто. RTFM look_write protected.
Это ясно. Как обехать (или избежать) я знаю и использую.
Но для читающих транзакций достаточно снапшота.
Изначальный мой вопрос имеет смысл только для RC.
Мадорский Г.В. ...
Что-то типа такого подойдет?
while Gen_Id(LockGen,0) = 1 do
begin
end;
Select Gen_Id(LockGen,1) from rdb$database
Тута работаем...
Не пойдёт. Ибо нет гарантии, что Gen_Id(LockGen,1)
выполнил только один процесс.
--
Хорсун Влад
sw [EMAIL PROTECTED] сообщил/сообщила в
новостях следующее: news:[EMAIL PROTECTED]
Что-то типа такого подойдет?
Спасибо, примерно что-то вроде этого (только с квадратными колёсами)
недавно изобретал.:)
Ну есть и еще способы - уровнем изоляции транзакций поиграться, select for
Horsun Vlad [EMAIL PROTECTED]
сообщил/сообщила в новостях следующее: news:[EMAIL PROTECTED]
Мадорский Г.В. ...
Что-то типа такого подойдет?
while Gen_Id(LockGen,0) = 1 do
begin
end;
***
Select Gen_Id(LockGen,1) from rdb$database
Тута работаем...
Не пойдёт.
Мадорский Г.В. ...
Horsun Vlad ...
Мадорский Г.В. ...
Что-то типа такого подойдет?
while Gen_Id(LockGen,0) = 1 do
begin
end;
***
Select Gen_Id(LockGen,1) from rdb$database
Тута работаем...
Не пойдёт. Ибо нет гарантии, что Gen_Id(LockGen,1)
update MASTER_TABLE set MY_AGREGAT = (select sum(COST) from DETAIL_TABLE)
две транзакции одновременно такое сделать не смогут - выскочит dead lock
я таким образом считаю агрегаты по документам
PS пример есс-но нерабочий, оформляется в виде процедуры
Спасибо, но это из несколько другой оперы.
while Gen_Id(LockGen,0) = 1 do
begin
end;
***
Select Gen_Id(LockGen,1) from rdb$database
Тута работаем...
Не пойдёт. Ибо нет гарантии, что Gen_Id(LockGen,1)
выполнил только один процесс.
В смысле может вклинится еще один процесс в промежуток отмеченный
Мадорский Г.В. wrote:
Конечно - кто-то же должен уменьшить генератор ;)
Так почему кто-то другой не может его увеличить ?
Вероятность такая есть конечно, спорить не буду. Но я лет пять назад ей
пренебрег. Пока не нарывался... :).
Без блокировок (в том или ином виде) такие задачи
Понятно что такие действия в общем случае желательны в снапшотах. Но
всё-таки...
хочешь сделать так чтобы ReadCommited работала также как снапшот?
--
Булычев Алексей
http://www.stella-npf.ru
Boulitchev Aleksey ...
Понятно что такие действия в общем случае желательны в снапшотах. Но
всё-таки...
хочешь сделать так чтобы ReadCommited работала также как снапшот?
Есть разница когда снапшот работает в пределах всей тр-ции, или когда
у каждого запроса _свой новый_ снапшот
--
sw wrote:
Нет.
Просто интересно было ситуация, вкоторой каждый запрос оборачивается в своего
рода мини снапшот. И насколько таковая фича реальна в
FB.
Конечно остаются ещё много неопределённостей (вложенные запросы, процедуры,
срабатывание триггеров и т.д.).
Так. Знач, важно чтоб агрегат
оригинальничания? Всё-тки трудно, как же трудно, божежмой, сначала думать,
потом хотеть, наоборот-то куда как антересней...
Дед, они наверное о том, что в агрегате типа
select sum(*), count(*), avg(FIELD1) from MY_TABLE
может пойти рассогласование.
мое-то мнение простое, если группа
Boulitchev Aleksey wrote:
мое-то мнение простое, если группа отчетов(выборок в отчете) может
расходиться - значит снапшот, если отчет оценочный - значит read commited
Дык и я об том же.
--
Regards. Ded.
Лисапет на гусеничном ходу гришь? А чо бы просто-напросто не завести
табличку
Critical_Functions
Function_Name (или Functions_Group_Name)
Column_For_Block
и долбиться в неё с блокировкой перед стартом функции до получения
удовлетворения? Классический случай варианта 6 упомянутой тобой
Мадорский Г.В. wrote:
P.S. А ты на конференции будешь?
Не-а.
--
Regards. Ded.
P.S. А ты на конференции будешь?
Не-а.
а я кристалла калужского заготовил. может передать через доверенное лицо?
--
Булычев Алексей
http://www.stella-npf.ru
Boulitchev Aleksey wrote:
а я кристалла калужского заготовил. может передать через доверенное лицо?
Смущаясь и ковыряя ножкой линолеум - ну... если Глебушка поедет... с
ним вместе и продегустируем потом, спасибо :)
--
Regards. Ded.
P.S. А ты на конференции будешь?
Не-а.
Жаль. А то жена мне тут притаранила оч-чень недурственного коньячку. Думаю в
поезд с собой бутылек прихватить :). Правда я и сам до сих пор в непонятках.
Может в пятницу на урал лететь придется...
With b/r. Gleb.
22 matches
Mail list logo