у нас есть поле целочисленного счетчика в таблице CHILD_CODES, которое мы используем для назначения уникального идентификатора каждой дочерней записи, добавляемой к таблице CHILD. Очевидно, что использование согласованного чтения или чтения в режиме совместного доступа для получения текущего значения счетчика не подходит, так как два пользователя базы данных могут получить одно и то же значение счетчика и создать дублирующиеся ключи при добавлении двух дочерних записей в таблицу.
                  
                  
                  
                  
                  
                  Для этого случая возможны два способа произвести чтение и увеличить значение счетчика: (1) сначала обновить значение счетчика, увеличив его на 1, и только после этого прочитать его или (2) сначала прочитать счетчик в режиме блокировки FOR UPDATE, а после этого увеличить его значение:
                  
                  
                  
                  
                  
                  SELECT COUNTER_FIELD FROM CHILD_CODES FOR UPDATE;
                  
                  
                  UPDATE CHILD_CODES SET COUNTER_FIELD = COUNTER_FIELD + 1;
                  
                  
                  
                  
                  
                  Оператор SELECT ... FOR UPDATE прочитает последние доступные данные с установкой отдельной блокировки на каждую считываемую строку. Таким образом, блокировка на строки устанавливается точно так же, как и в случае поиска по UPDATE.
                  
                  
                  
                  
                  
                  Можно ли в данной транзакции считать значение счетчика повторно?
                  
                  
                  т.е. вклинить например
                  
                  
                  SELECT SUM(COUNTER_FIELD) FROM CHILD_CODES;
                  
                  
                  между блокировкой и обновлением?
                  
                  
                  
                  
                  
                  SELECT COUNTER_FIELD FROM CHILD_CODES FOR UPDATE;
                  
                  
                  UPDATE CHILD_CODES SET COUNTER_FIELD = COUNTER_FIELD + 1;
                  
                  
                
что-то мне подсказывает, что ты перемудрил с архитектурой
Обсуждают сегодня