PostgreSQL DB: v 9.4.24
create table my_a_b_data ... // with a_uuid, b_uuid, and c columns
ПРИМЕЧАНИЕ: my_a_b_data хранит ссылки на таблицы a и b. Таким образом, он хранит uuids a и b.
, где: primary key (a_uuid, b_uuid)
есть также index :
create unique index my_a_b_data_pkey
on my_a_b_data (a_uuid, b_uuid);
In Java jdb c -подобный код в области действия одной транзакции: (start() -> [code (delete, insert)] ->commit()])
(org.postgresql:postgresql:42.2.5 driver
)
delete from my_a_b_data where b_uuid = 'bbb';
insert into my_a_b_data (a_uuid, b_uuid, c) values ('aaa', 'bbb', null);
Я обнаружил, что вставка не удалась, потому что удаление еще не удалено. Таким образом, он терпит неудачу, потому что его нельзя дублировать.
Q: Является ли какое-то ограничение в PostgreSQL тем, что DB не может выполнить удаление и вставить в одну транзакцию, потому что PostgreSQL не обновляет свои индексы до тех пор, пока не будет выполнена фиксация удаления, поэтому вставка не удастся, поскольку идентификатор или ключ (что бы мы ни использовали) уже существует в индексе?
Какое было бы возможное решение? Разделение на две транзакции?
ОБНОВЛЕНИЕ: порядок точно такой же. Когда я тестирую sql в консоли SQL. Работает нормально. Мы используем библиотеку JDBI v 5.29.
там это выглядит так:
@Transaction
@SqlUpdate("insert into my_a_b_data (...; // similar for the delete
public abstract void addB() ..
Итак, в коде:
this.begin();
this.deleteByB(b_id);
this.addB(a_id, b_id);
this.commit();