Рассмотрим следующую схему в базе данных postgres.
CREATE TABLE employee
(
id_employee serial NOT NULL PrimarKey,
tx_email_address text NOT NULL Unique,
tx_passwd character varying(256)
)
У меня есть класс Java, который выполняет следующие действия:
conn.setAutoComit(false);
ResultSet rs = stmt.("select * from employee where tx_email_address = 'test1'");
if (!rs.next()) {
Insert Into employee Values ('test1', 'test1');
}
ResultSet rs = stmt.("select * from employee where tx_email_address = 'test2'");
if (!rs.next()) {
Insert Into employee Values ('test2', 'test2');
}
ResultSet rs = stmt.("select * from employee where tx_email_address = 'test3'");
if (!rs.next()) {
Insert Into employee Values ('test3', 'test3');
}
ResultSet rs = stmt.("select * from employee where tx_email_address = 'test4'");
if (!rs.next()) {
Insert Into employee Values ('test4', 'test4');
}
conn.commit();
conn.setAutoComit(true);
Проблема здесь в том, что два или более параллельных экземпляра вышеупомянутой транзакции пытаются записать данные. Только одна транзакция в конечном итоге будет успешной, а остальные вызовут SQLException «нарушение ограничения уникального ключа». Как нам обойти это.
PS: я выбрал только одну таблицу и простые запросы на вставку, чтобы продемонстрировать проблему. Мое приложение - это Java-приложение, единственная цель которого - записать данные в целевую базу данных. и при этом может быть одновременный процесс, и существует очень высокая вероятность того, что какой-то процесс может пытаться записывать одни и те же данные (как показано в примере выше).