powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вставка записи с автоинкрементом с блокировкой
24 сообщений из 24, страница 1 из 1
Вставка записи с автоинкрементом с блокировкой
    #39249803
lexxvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача. Есть только удаленное подключение к БД, к определенным таблицам.
Есть таблица АAA.
Записать в нее данные, с уникальным полем ID.
Как я делаю сейчас:
'SELECT * FROM (SELECT ID FROM AAA ORDER BY ID DESC) WHERE ROWNUM <= 1';
Получив ID, увеличиваю его на 1.
$id++;
Далее вставляю запись.
'INSERT INTO AAA (ID,DATA) VALUES ($id,$data)';
По коду конечно отличается немного, суть такая, упростил для понимания.

Возникла проблема - в процессе работы появились записи с дублирующим ID.
Как избежать этого?

Я с Ораклом глубоко на "вы", работаю с mysql.
Думаю может надо так:
1. определяю, заблокирована таблица или нет. если да, то выходим.
2. ставим блокировку таблицы.
3. определяю новое ID
4. вставляю запись
5. Снимаю блокировку.

Но как это реализовать и правильно ли так не пойму. Требуется помощь :)
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249809
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lexxvladКак избежать этого?
почитать про key fields и sequence.
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249813
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249822
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 lexxvlad
123ййlexxvladКак избежать этого?
почитать про key fields и sequence.
+ про returning кляузу в sql dml
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249869
lexxvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Внесу условие. Таблица ААА уже существует, с ней уже работаем, в ней уже есть какие-то записи.
Нужно чтобы начиная с ней работать с любого момента, ID правильно прописывалось.
Имеется только удаленный доступ к одной таблице и все. Я не могу зайти на сервер и что-то там создать.
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249873
lexxvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я еще не зря написал написал, что с Ораклом на Вы.
Мне по работе нужно ложить записи в одну таблицу и все. Все остальное делаем на мускуле.
Если кто-то поможет написать конкретный запрос - большое ему за то спасибо :)
Так вещи типа:
автор+ про returning кляузу в sql dml
я даже не знаю, что об ентом думать :)
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249878
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lexxvlad Я не могу зайти на сервер и что-то там создать.
Лучше все таки один раз создать (хотя бы через DBA), чем постоянно мучаться с блокировками таблицы и, как следствие, тормозами в работе.
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249891
lexxvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tru55lexxvlad Я не могу зайти на сервер и что-то там создать.
Лучше все таки один раз создать (хотя бы через DBA), чем постоянно мучаться с блокировками таблицы и, как следствие, тормозами в работе.
С этим моментом решим через админа сервера, где оракл стоит. Т.е. они создадут счетчик, чтобы было автоинкрементное поле.
Но мне нужно решить также вопрос, исходя из ситуации, что такой счетчик создать невозможно.
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249894
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lexxvladНо мне нужно решить также вопрос, исходя из ситуации, что такой счетчик создать невозможно.
Это как ехать на велосипеде без педалей ) Нет. Хуже. Без колес )))
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249915
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИмеется только удаленный доступ к одной таблице
что вы под этим подразумеваете ?
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249926
lexxvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AvotgelexxvladНо мне нужно решить также вопрос, исходя из ситуации, что такой счетчик создать невозможно.
Это как ехать на велосипеде без педалей ) Нет. Хуже. Без колес )))
Пуская так, но нужно автономное решение.
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249927
lexxvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123ййавторИмеется только удаленный доступ к одной таблице
что вы под этим подразумеваете ?
Я немогу зайти в DBA (или как там оно называется). И у меня есть доступ только к одной таблице AAA и все.
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249928
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lexxvladНо мне нужно решить также вопрос, исходя из ситуации, что такой счетчик создать невозможно.
1. Брать lock table in exclusuve mode перед вставкой. И пусть весь мир подождет.
2. Если вставкой не занимается "третья сила" (т.е. Вы - единственный писатель, весь код, вставляющий данные в таблицу, Вам подконтролен) - то можно использовать dbms_lock, это даст возможность не препятствовать всяким update.
3. Повесить primary|unique key. Обрабатывать exception dup_val_on_index - зациклить вычисление id и вставку до успеха.
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249930
lexxvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymouslexxvladНо мне нужно решить также вопрос, исходя из ситуации, что такой счетчик создать невозможно.
1. Брать lock table in exclusuve mode перед вставкой. И пусть весь мир подождет.
2. Если вставкой не занимается "третья сила" (т.е. Вы - единственный писатель, весь код, вставляющий данные в таблицу, Вам подконтролен) - то можно использовать dbms_lock, это даст возможность не препятствовать всяким update.
3. Повесить primary|unique key. Обрабатывать exception dup_val_on_index - зациклить вычисление id и вставку до успеха.
Буду очень признателен, если это в запросах покажете :)
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249934
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lexxvladЯ немогу зайти в DВАа ты ей водки налей.
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249936
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lexxvladЯ немогу зайти в DBA (или как там оно называется). И у меня есть доступ только к одной таблице AAA и все.
DBA, синонимы:
1. DBA - database administrator - администратор базы данных - АБД - ЧЕЛОВЕК, занимающийся всеми вопросами эксплуатации БД.
2. DBA, nata1111 - уважаемый специалист, автор широко известных в узких кругах эпохальных трудов по reverse engineering структур данных oracle rdbms
3. DBA - роль в rdbms Oracle
4. dba, ORA_DBA - группа ОС, позволяющая локально заходить as sysdba без ввода пароля
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249941
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousDBA, синонимы:

Читать: омонимы
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249949
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может такой жескач попробовать? ))
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
SQL> CREATE TABLE sequence_tab(id NUMBER)
  2  /
 
Table created

SQL> INSERT INTO sequence_tab (ID) VALUES (1)
  2  /
 
1 row inserted
 
SQL> CREATE FUNCTION GET_SEQUENCE_NEXT RETURN NUMBER
  2  IS
  3     CURSOR cur IS
  4       SELECT id
  5         FROM sequence_tab FOR UPDATE;
  6     v_id NUMBER;
  7  
  8  BEGIN
  9     OPEN cur;
 10     FETCH cur INTO v_id;
 11  
 12     UPDATE sequence_tab
 13        SET id = v_id + 1;
 14     COMMIT;
 15  
 16     RETURN v_id;
 17  END;
 18  /
  
Function created
 
SQL> DECLARE
  2    n NUMBER;
  3  BEGIN
  4    n := get_sequence_next;
  5    DBMS_OUTPUT.put_line(n);
  6    n := get_sequence_next;
  7    DBMS_OUTPUT.put_line(n);
  8  END;
  9  /

...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249968
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AvotgeМожет такой жескач попробовать? ))
Я в свое время делал что-то похожее. Лет 20 назад. Правда на Clipper-е :))
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39249989
Avotge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tru55Правда на Clipper-е :))
Порой и сейчас бы охота что-то такое в минимализме, прямое и квадратное )
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39250120
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AvotgeМожет такой жескач попробовать? ))если ТС не может создать сиквенс, думаете он может создать таблицу?
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39250122
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lexxvlad..
Так вещи типа:
автор+ про returning кляузу в sql dml
я даже не знаю, что об ентом думать :)
ну, сегодня погода шепчет , попробую разжевать

1) ваши потуги из стартового поста - вам надо выбросить и забыть
2) как выше писали - у оракла есть способы генерации неповторяющихся идентификаторов
3) например, объект sequence, генерирующий неповторяющееся число (элемент ряда, например натуральных чисел)
обращение к функции, извлекающей из того самого sequence то самое следующее неповторяющееся число можно использовать непосредственно в командах sql dml
Код: plsql
1.
insert into blabla (..) values (my_seq.nextval,..) returning ..

смысл использования returning clause в том, чтобы (если вам надо) вернуть в например переменную вашей программы, то самое число, которое ( было внутри sql-команды insert получено из sequence и) использовано.
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39250146
Avotge,

курсор, опен, фетч, апдейт коммит и без клозе вместо одного апдейта. демонстрацию неотлаженного и неоптимального алгоритма замены создания сиквенса созданием таблицы выгоднее демонстрировать менее формальным языком, чем plsql.
...
Рейтинг: 0 / 0
Вставка записи с автоинкрементом с блокировкой
    #39250240
Никому
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
комувместо одного апдейта
Ну да типа
Код: plsql
1.
UPDATE table1 SET id = id + 1 RETURNING id INTO some_var;


На то он и есть жескач и да не отлаженный и не оптимальный и вообще plsql )
А какие более нормальные варианты не plsql? select max() с попытками блокировки таблицы? )
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вставка записи с автоинкрементом с блокировкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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