Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Транзакции в процедурах
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Есть такая проблема Процедура: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. На таблице words стоит уникальный индекс на поле name При выполнении иногда выдаёт ошибку: ERROR: duplicate key violates unique constraint "word_name" Процедура вызывается из многопоточного приложения. Может быть так что между Select ... Insert в таблицу добавляется то самое слово, которое мы пытаемся инсертить? И если да, то как с этим бороться ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2006, 15:49 |
|
||
|
Транзакции в процедурах
|
|||
|---|---|---|---|
|
#18+
IF find_words IS NULL THEN >> IF NOT FOUND THEN ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2006, 17:14 |
|
||
|
Транзакции в процедурах
|
|||
|---|---|---|---|
|
#18+
Мало того: слово может вставиться еще до первого select и закомититься после (если уровень сериализации read commited) Лечить как? Гуру могут предложить правильный вариант, мои предложения: - или вставку слов осуществлять из одного потока - или ловить данную ошибку и делать вторую попытку. Я лично за второй вариант, хотя и первый не плох, если не надо скорость любой ценой (и неизвестно что быстрее, кстати: если на сервере одно ядро, то вставка через одно соединение может быть быстрее). Умные люди могут подсказать третий. например Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2006, 17:18 |
|
||
|
Транзакции в процедурах
|
|||
|---|---|---|---|
|
#18+
Funny_Falcon - или вставку слов осуществлять из одного потока не подходит, структура приложения не позволяет Funny_Falcon - или ловить данную ошибку и делать вторую попытку. А что если и вторая попытка обломается ? ;-) Конечно вероятность мала, но всё же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2006, 17:54 |
|
||
|
Транзакции в процедурах
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2006, 18:22 |
|
||
|
Транзакции в процедурах
|
|||
|---|---|---|---|
|
#18+
токо вместо поля word - name ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2006, 18:24 |
|
||
|
Транзакции в процедурах
|
|||
|---|---|---|---|
|
#18+
golden13На таблице words стоит уникальный индекс на поле nameэто кстати приведет к тому, что конкурирующий процесс попросту повиснет на инсерте до закрытия первой записавшей данное значение транзакции, и вернет уже присвоенное той значение (или запишет свое - если та обломается). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2006, 18:31 |
|
||
|
Транзакции в процедурах
|
|||
|---|---|---|---|
|
#18+
4321 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. А в данном случае разве не может возникнуть ситуации когда между селектом и инсертом в таблицу добавляется то самое слово другим процессом ? Или здесь так как всё это в рамках инсерта, то блокируется таблица/запись с искомым словом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2006, 22:50 |
|
||
|
Транзакции в процедурах
|
|||
|---|---|---|---|
|
#18+
торможу. в данном случае всё ок. Спасибо, это как раз то что нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2006, 23:01 |
|
||
|
Транзакции в процедурах
|
|||
|---|---|---|---|
|
#18+
Просто ради интереса: а мой вариант той процедуры прокатил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 10:52 |
|
||
|
Транзакции в процедурах
|
|||
|---|---|---|---|
|
#18+
golden13А в данном случае разве не может возникнуть ситуации когда между селектом и инсертом в таблицу добавляется то самое слово другим процессом ? Или здесь так как всё это в рамках инсерта, то блокируется таблица/запись с искомым словомнет блокировка на вставку тут возникнет из-за уникью (тот случай, когда версионник ведет себя как блокировочник)). и будет держаться вплоть до завершения конкурирующей транзакции. при этом транзакция будет висеть на инсерте дожидаясь чем кончится конкурирующая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 11:20 |
|
||
|
Транзакции в процедурах
|
|||
|---|---|---|---|
|
#18+
Funny_FalconПросто ради интереса: а мой вариант той процедуры прокатил? вроде да, хотя основательно я не тестировал :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 13:06 |
|
||
|
Транзакции в процедурах
|
|||
|---|---|---|---|
|
#18+
Не уверен, что я правильно осознал все обсуждавшиеся проблемы, но IMHO было достаточно просто SELECT .. FOR UPDATE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2006, 15:55 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=33634389&tid=2006515]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 258ms |
| total: | 407ms |

| 0 / 0 |
