powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Уровни изолированности транзакций
21 сообщений из 21, страница 1 из 1
Уровни изолированности транзакций
    #39833100
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем привет..столкнулся с такой проблемой..есть процедура в теле которой идет проверка(назовем ее Т1) на возможность вставки строки в таблицу...коммит на стороне клиента.
Клиент обращается к бд проходит Т1 и делает вставку..зависает..сотрудник обновляет страницу ..генерируется новая сессия которая вызывает ту же процедуру проходит T1 и делает коммит..в это же время прилетает коммит от первой сессии и возникает дубль.
На таблицу не могу поставить констрейн, и не могу в тригере before insert поставить проверку т.к. в некотоырх кейсах эти дубли должны быть.
Архитектура реализована через одно место..проблема еще в том, что коммит с первой сессии может и не прилететь.
Есть ли способ мало й кровью победить багу средствами Oracle?
Навскидку приходит вариант в T1 установить read uncommited...или через мьютекс на всю процедуры вставки
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39833102
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один из способов решения недокоммиченного insert.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
procedure add_lock_head(sort_ head.sort%type) is

pragma autonomous_transaction;

begin
  begin
    insert into head_lock(sort) values(sort_);
  exception when DUP_VAL_ON_INDEX then null;
  end;
  commit;
  return;
end;

function lock_head(sort_ head.sort%type) return number is

i head_lock.sort%type;

begin
  add_lock_head(sort_);
  begin
  select sort into i from head_lock where sort = sort_ for update nowait;
  exception when RESOURCE_BUSY then
    return 1;
  end;
  return 0;
end;
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39833111
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdmОдин из способов решенияНедоdbms_lock ничем не лучше констрейнта.
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39833145
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо, но чет сдается мне лучше поставить read uncommited на Т1.
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39833148
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frogлучше поставить read uncommited на Т1.Ну поставь.
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39833199
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frogлучше поставить read uncommited на Т1
а почему не можете констрейнт, по религиозным соображениям?
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39833221
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-cobalt_frogлучше поставить read uncommited на Т1.Ну поставь.
Лучше посадить. Хотя
авторВо деревня! Кто ж его посадит! Он же памятник! (с)

Regards

Maxim
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39833248
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проблема только в том, что read uncommitted в оракле не установить)))
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39833279
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frogпроблема только в том, что read uncommitted в оракле не установитьread uncommited это read commited + autocommit.
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39833337
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frogпроцедура в теле которой идет проверка(назовем ее Т1) на возможность вставки строки в таблицу...
Клиент обращается к бд проходит Т1 и делает вставку..
Изначально нерабочий подход, о чем написано в множестве книжек, статей и просто на заборах.
cobalt_frogНа таблицу не могу поставить констрейн, и не могу в тригере before insert поставить проверку т.к. в некотоырх кейсах эти дубли должны быть.

В триггером эта задача также не решается, поскольку правила acid для триггера никто не отменял.
Conatraint - единственный корректный способ решения указанной задачи.
Менее корректный, но тоже рабочий - lock table in exclusive mode перед вызовом T1
Кроме того, можно изменить определение первичного/уникального ключа, добавив в него второй компонент, который позволит делать дубли когда надо и не делать когда не надо.

cobalt_frogАрхитектура реализована через одно место..
Ну так измените архитектуру.
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39833413
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frogАрхитектура реализована через одно место..Ассенизаторы говорят, что деньги не пахнут, и гордо называются золотарями.
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39834173
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

ну так изменяю и переписываю..нужен был патч временный чтобы багу поправить.
Сделал через через автономку.
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39834238
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymouscobalt_frogпроцедура в теле которой идет проверка(назовем ее Т1) на возможность вставки строки в таблицу...
Клиент обращается к бд проходит Т1 и делает вставку..
Изначально нерабочий подход, о чем написано в множестве книжек, статей и просто на заборах.
cobalt_frogНа таблицу не могу поставить констрейн, и не могу в тригере before insert поставить проверку т.к. в некотоырх кейсах эти дубли должны быть.

В триггером эта задача также не решается, поскольку правила acid для триггера никто не отменял.
Conatraint - единственный корректный способ решения указанной задачи.
Менее корректный, но тоже рабочий - lock table in exclusive mode перед вызовом T1
Кроме того, можно изменить определение первичного/уникального ключа, добавив в него второй компонент, который позволит делать дубли когда надо и не делать когда не надо.

cobalt_frogАрхитектура реализована через одно место..
Ну так измените архитектуру.

спасибо за развернутый ответ.

1. Когда я говорил про триггер я и имел ввиду добавление в него второй компоненты..можно подробнее что из acid он нарушает?
2. С базой работает много клиентов...сессии бывает что не закоммичены ...lock table in exclusive mode будет же ждать долго, разве это не приведет к проблемам?
3. Констрейнт с доп компонентой мне кажется лучшим решением..тут вы правы.

Код: plsql
1.
2.
create table tt1(a number,b number,is_dupl_possibility number); --is_dupl_possibility 1 - можно дубликаты
create unique index ind_1 on tt1(decode(is_dupl_possibility,1,null,a),decode(is_dupl_possibility,1,null,b));
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39834286
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frog
Код: plsql
1.
create unique index ind_1 on tt1(decode(is_dupl_possibility,1,null,a),decode(is_dupl_possibility,1,null,b));


а попроще не могли что ли код написать???
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39834335
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex-ls,

например?
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39834339
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frog1. Когда я говорил про триггер я и имел ввиду добавление в него второй компоненты..можно подробнее что из acid он нарушает?
Для обеспечения уникальности записи посредством чтения таблицы необходимо (но недостаточно) "видеть" незафиксированные изменения конкурирующих транзакций. Триггер, как и любой другой pl/sql код, этого не может в силу ACID, потому задача триггером не решается.

cobalt_frog2. С базой работает много клиентов...сессии бывает что не закоммичены ...lock table in exclusive mode будет же ждать долго, разве это не приведет к проблемам?
Вы сами принимаете решения относительно своей системы в конкретных условиях.

cobalt_frog3. Констрейнт с доп компонентой мне кажется лучшим решением..тут вы правы.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create table dropme_t(id number not null, sub_id number, val varchar2(100), constraint dropme_t#pk unique(id, sub_id))
;

insert into dropme_t values(1, null, 'Unique 1');
insert into dropme_t values(1, null, 'Attemp to duplicate 1');

insert into dropme_t values(2, 3, 'Non-Unique 2-1');
insert into dropme_t values(2, 4, 'Non-Unique 2-2');
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39834354
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymouscobalt_frog1. Когда я говорил про триггер я и имел ввиду добавление в него второй компоненты..можно подробнее что из acid он нарушает?
Для обеспечения уникальности записи посредством чтения таблицы необходимо (но недостаточно) "видеть" незафиксированные изменения конкурирующих транзакций. Триггер, как и любой другой pl/sql код, этого не может в силу ACID, потому задача триггером не решается.

cobalt_frog2. С базой работает много клиентов...сессии бывает что не закоммичены ...lock table in exclusive mode будет же ждать долго, разве это не приведет к проблемам?
Вы сами принимаете решения относительно своей системы в конкретных условиях.

cobalt_frog3. Констрейнт с доп компонентой мне кажется лучшим решением..тут вы правы.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
create table dropme_t(id number not null, sub_id number, val varchar2(100), constraint dropme_t#pk unique(id, sub_id))
;

insert into dropme_t values(1, null, 'Unique 1');
insert into dropme_t values(1, null, 'Attemp to duplicate 1');

insert into dropme_t values(2, 3, 'Non-Unique 2-1');
insert into dropme_t values(2, 4, 'Non-Unique 2-2');



спс.
тут приходит на sub_id накидывать доп логику..сиквенс и т.д. вариант предложенный мной не проще? тупо вставил необходимые поля и если разрешаешь дупликаты просто вставляешь 1 в поле...или вы там видите какую то проблему.?
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39834364
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frogвариант предложенный мной не проще?
Ваш вариант какой-то говнокод, который потом никто не разберет
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39834366
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex-lscobalt_frogвариант предложенный мной не проще?
Ваш вариант какой-то говнокод, который потом никто не разберет

толсто))
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39834370
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frogalex-lsпропущено...

Ваш вариант какой-то говнокод, который потом никто не разберет

толсто))
вы знаете как работает FBI?
...
Рейтинг: 0 / 0
Уровни изолированности транзакций
    #39834373
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frogкакую то проблему.?
Помимо обеспечения целостности данных обычно стоит задача эти данные как-то использовать.
Сослаться на них FK, отобрать, изменить, соединить с данными других таблиц.
Когда рассмотрите все потребные в Вашем случае варианты использования, сможете сами себе ответить на вопрос - является ли Ваш FBI решением или проблемой.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Уровни изолированности транзакций
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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