Я использую готовые заявления Java Пакет для вставки нескольких строк в базу данных. Иногда в партии есть два идентичных оператора вставки с одним и тем же значением первичного ключа, и это генерирует исключение, которое является нормальным. Мой вопрос заключается в том, что происходит с данными, которые были вставлены перед исключением? Должен ли он быть вставлен (зафиксирован) или вызван откатом? Я не могу найти документацию об этом.Поведение подготовленной выписки Пакет при возникновении исключения
Я провел несколько экспериментов с двумя идентичными вставками SQL в одной партии. Это псевдокод:
int[] inserted;
PreparedStatement PreparedStatementInsert ... prepared with two identical SQL inserts.
try {
inserted = PreparedStatementInsert.executeBatch();
} catch (BatchUpdateException e) {
// program enters this part
inserted = e.getUpdateCounts();
}
В моем эксперименте блок задвижки выполнен и массив вставлено имеет один вставленный элемент [0] = 1. Из документации я пришел к выводу, что один (первый) INSERT выполняется успешно и второй - нет. Но когда я смотрю на базу данных, она пуста, как будто INSERT не было сделано. Есть ли какая-то документация или объяснение этого поведения? Я использую Java 6 с базой данных Postgres 9.0.
Чтобы быть в безопасности, следует ли использовать транзакции? – vikingsteve
Postgres имеет интересное поведение, если вы используете единую транзакцию для своей объемной вставки. Всякий раз, когда происходит нарушение ограничения, транзакция автоматически откатывается. Никакие строки не вставлены вообще. См. Http://stackoverflow.com/questions/9436122/how-can-i-tell-postgresql-not-to-abort-the-whole-transaction-when-a-single-const – nif
Если вы хотите узнать заданного поведения, посмотрите его в спецификации JDBC 4.1. –