|
|
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Всем привет! Есть таблица test (id number,value varchar2). Id присваиваются при инсерте триггером и сиквенсом. Хотел написать процедуру которая добавляет еще одну строчку к таблице: begin insert into test05 (value) (select max(id)||'a' from test05); end; Но хочется чтобы это происходило с применением "последовательности сессий", т.е. с применением FOR UPDATE. Написал это: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Однако оно делает этот инсерт ровно столько раз, сколько в данный момент строчек в таблице. Вообще у меня очень плохое понимание что есть курсор, в данном случае для меня это просто "снимок" таблицы на определенный момент времени. Прошу помочь разобраться, Большое спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 09:46 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьумен, Может все-таки сначала цель скажешь? Чего добиться-то хочешь в итоге? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 09:51 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьуменВообще у меня очень плохое понимание что есть курсор... Прошу помочь разобраться У вас очень плохое понимание, что тfкое цикл (неважно, что по курсору) - попробуйте начать с этого - что такое цикл и почему "оно делает этот инсерт ровно столько раз, сколько в данный момент строчек в таблице." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 09:53 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьуменНо хочется чтобы это происходило с применением "последовательности сессий", т.е. с применением FOR UPDATE. Расшифруйте пожалуйста, что вы хотели этим сказать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 09:55 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Не понятно, хочу чтобы при срабатывании процедуры добавлялась в таблицу одна строчка. И если, например, процедуру запустят почти одновременно два человека, то один из них должен ждать второго, чтобы не получить в таблице двух строчек с одинаковым value, но разными id. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 09:57 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
..а. .. понял сбило с толка вырфжение "последовательности сессий" , которое относится, как первоначално показалось, не к сессиям, а, на самом деле, к последовательности.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 09:58 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьуменНе понятно, хочу чтобы при срабатывании процедуры добавлялась в таблицу одна строчка. И если, например, процедуру запустят почти одновременно два человека, то один из них должен ждать второго, чтобы не получить в таблице двух строчек с одинаковым value, но разными id. Нужно именно ЖДАТЬ? или просто нужно разные value для разных строчек? Типа еще один уникальный ключ в дополнение к id? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 10:01 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
хм.. неправильно понял.. А чем вам сиквенс не угодил, зачем вам велосипед? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 10:01 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьумен, lock table test05 in exclusive mode ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 10:05 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьуменхочу чтобы при срабатывании процедуры добавлялась в таблицу одна строчка. И если, например, процедуру запустят почти одновременно два человека, то один из них должен ждать второго, чтобы не получить в таблице двух строчек с одинаковым value, но разными id . Не понятноМожет все-таки сначала цель скажешь? Чего добиться-то хочешь в итоге? К чему, для чего эта совершенно непонятная сторока?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 10:08 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Возможно я привел плохой пример, я читал книгу по ораклу и там был очень подходящий пример: Допустим есть таблица в которой каждая строка это бронь на то или иное место в кинозале. Т.е. там будут приблизительно такие поля: ID,Время сеанса, место, ФИО человека. И есть приложение работающее с этой таблицей, которое перед инсертом просматривает таблицу на предмет не занято ли это время-место. Так вот если оно будет смотреть на эту таблицу без FOR UPDATE , то может получиться что два человека забронируют одно место одновременно. Я просто хотел повторить этот процесс, написать процедуру с использованием for update и запустить ее одновременно из двух разных сессий ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 10:11 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьумен, тогда просто уникальный индекс добавь на поле value. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 10:13 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьуменВозможно я привел плохой пример, я читал книгу по ораклу и там был очень подходящий пример: Вот возьмите тот пример в оригинале и воспроизведите дословно, без отсебятины. Потом разберите до последнего "end;" Попробуйте позвать из нескольких сессий и т.п. И когда поймете что это и как именно работает - начинайте эксперименты с изменением текстов. Открытий на Вашем пути еще очень много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 10:19 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Если уж вы хотите повторить, создать собственный test case, так вкладываете в него хоть какую-то логику событий. Логика событий и диктует логику реализации.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 10:20 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, да в том и дело, что пример не был дословно описан было лишь упоминание что проблема решилась использованием for update книга -Oracle для профессионалов. Архитектура, методики программирования и особенности версий ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 10:21 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьуменкнига -Oracle для профессионалов. Архитектура, методики программирования и особенности версий Ну понятно. Тома нашего Кайта надо читать ПОСЛЕ официальной доки, а не до. Том реально предполагает, что его читатель уже "в теме". Минимум, который надо освоить перед чтением Кайта или, упаси Бог, Льюиса и прочих Арупов Нандов, Кэрри Миллсапов или кого еще там найдете в магазине: Application Development Guide на Вашу версию сервера + database concepts, как минимум - главы "Data concurrency and consistency" Ну про SQL Reference вообще молчу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 10:27 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьуменпример не был дословно описан Словами пример описан самодостаточно. Ну так и пробуйте... пишите код именно в той логике событий.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 10:29 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Viewer, Код: plsql 1. 2. 3. 4. 5. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Я сделал вот такую процедуру, она работает. Но я все равно не понимаю в каком месте надо прикручивать FOR UPDATE чтобы реализиовать то, о чем я писал. Проблема еще и в том что не удается "словить" момент когда при одновременном нажатии в таблицу попадут две строки с одинаковым mesto,seans_date и разными FIO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 11:29 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьуменв каком месте надо прикручивать FOR UPDATE Как звучит в переводе фраза "select for update "? Где здесь insert ? Для выполнения " for update " строка должна уже существовать. По сути "матрица" мест кинозала в таблице уже расписана (зал ведь не резиновый, не сдувается и не раздувается, не так ли?) Другое дело, что существующее место забронировано или нет. Попробуйте подумать в этом направлении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 13:03 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьуменЯ сделал вот такую процедуру, она работает. Не работает. Чтобы она работала - на таблице bron необходим primary или unique key по полям (MESTO,SEANS_DATE) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 13:11 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Эхх, вроде бы так должно работать, только не знаю как в этом удостовериться. По поводу unique key, если сделать такой ключ, то как я понимаю при попытке внести неправильную строку оракл выдаст что-то вроде "нарушено ограничение целостности" . Просто хотелось бы чтобы строки даже не пытались вставляться, чтобы процедура не позволяля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 13:42 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьуменПросто хотелось бы чтобы строки даже не пытались вставляться, чтобы процедура не позволяляГарантию может дать только уникальный ключ. Всё твои потуги - наивны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 13:47 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Elic, Окей, я понял что самый надежный способ- уникальный ключ. Но все-таки интересно, в чем проблема этой процедуры, почему она не обеспечивает того же самого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 13:57 |
|
||
|
Insert FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
неоченьуменПросто хотелось бы чтобы строки даже не пытались вставляться, чтобы процедура не позволяля Удостовериться: в двух сессиях параллельно запустить begin FOR_BRON (7654, trunc(sysdate),'Вася Пупкин'); end; затем, когда отработает - закоммитить обе сессии. Убедиться, что данные задублированы. Чтобы процедура "просто не позволяла" - то нужно наложить ограничение уникальности и обрабатывать exception в процедуре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 14:00 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39320771&tid=1887313]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
192ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 536ms |

| 0 / 0 |
