2013-07-10 2 views
2

Я использую готовые заявления 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.

+0

Чтобы быть в безопасности, следует ли использовать транзакции? – vikingsteve

+1

Postgres имеет интересное поведение, если вы используете единую транзакцию для своей объемной вставки. Всякий раз, когда происходит нарушение ограничения, транзакция автоматически откатывается. Никакие строки не вставлены вообще. См. Http://stackoverflow.com/questions/9436122/how-can-i-tell-postgresql-not-to-abort-the-whole-transaction-when-a-single-const – nif

+1

Если вы хотите узнать заданного поведения, посмотрите его в спецификации JDBC 4.1. –

ответ

0

Вы должны использовать метод addBatch() с объектом PreparedStatement т.е. PreparedStatementInsert1.addBatch(), PreparedStatementInsert2.addBatch() .. PreparedStatementInsertN.addBatch()

Тогда вы должны использовать PreparedStatementInsert. executeBatch();

Смежные вопросы