Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Вставка лишних записей  [new]
SunTechNick
Member

Откуда:
Сообщений: 32
Добрый день!

У меня есть приложение которое мониторит некоторый файл и по необходимости вставляет в базу новые записи если они ранее отсутствовали.
Приложение многопоточное и проблема в том что иногда в базу вставляются дубликаты записей.

Запрос для вставки такой:
INSERT INTO my_table
    (ID, field_1, field_2, field_3, field_4, field_5)
SELECT
    my_sequence.NEXTVAL,
    ?,
    ?,
    0,
    0,
    CURRENT_TIMESTAMP
FROM
    my_table
WHERE NOT EXISTS (
    SELECT
        1
    FROM
        my_table
    WHERE
        field_1 = ?
        AND field_2 = ?
)

Приложение написано на Java, используется thin драйвер, приложение бежит вне какого-либо контейнера.

Тразнакция коммитится ручками, уровень изоляции выставлен в Serializable:

try {
	connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
	connection.setAutoCommit(false);

	PreparedStatement statement = connection.prepareStatement(query);
	...
	statement.execute();

	connection.commit();
} catch (Exception e) {

	try {
		connection.rollback();
	} catch (SQLException ex) {
		log.error(ex);
	}

}

Вреся от времени приложение вставляет дубликаты записей.
Подскажите плиз, в чём может быть проблема?

Заранее спасибо.
24 ноя 08, 14:10    [6480014]     Ответить | Цитировать Сообщить модератору
 Re: Вставка лишних записей  [new]
_Alex_SMIRNOV_
Member

Откуда: Киев
Сообщений: 1519
Возможно в Serializable
24 ноя 08, 14:13    [6480028]     Ответить | Цитировать Сообщить модератору
 Re: Вставка лишних записей  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
В уровне изоляции Serializable Ваша сессия не видит тех данных которые были добавлены и зафиксированы в таблицу после того, как была начата ваша транзакция.
24 ноя 08, 14:21    [6480075]     Ответить | Цитировать Сообщить модератору
 Re: Вставка лишних записей  [new]
SunTechNick
Member

Откуда:
Сообщений: 32
Почитал про уровни изоляции на википедии: http://ru.wikipedia.org/wiki/%D0%A3%D1%80%D0%BE%D0%B2%D0%BD%D0%B8_%D0%B8%D0%B7%D0%BE%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D0%B9

Я так понимаю моя проблема это "Фантомная вставка".

В статье написано что как раз serializable от неё помогает, поэтому я этот уровень и выбрал.

Подскажите пожалуйста как называется косяк который у меня происходит, и какой уровень изоляции мне нужно выбрать?

Спасибо.
24 ноя 08, 14:31    [6480134]     Ответить | Цитировать Сообщить модератору
 Re: Вставка лишних записей  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Вас спасет уникальный индекс на таблице, или монопольная блокировка таблицы на время выполнения Ваших операций вставки. Уровни изоляции вас не спасут.
24 ноя 08, 14:38    [6480177]     Ответить | Цитировать Сообщить модератору
 Re: Вставка лишних записей  [new]
SunTechNick
Member

Откуда:
Сообщений: 32
Zloxa,

Блокировка таблицы - Вы имеете ввиду добавление FOR UPDATE к вложенному select'у?
24 ноя 08, 15:16    [6480423]     Ответить | Цитировать Сообщить модератору
 Re: Вставка лишних записей  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
SunTechNick
Блокировка таблицы - Вы имеете ввиду добавление FOR UPDATE к вложенному select'у?
Сами подумайте, что Вам даст блокировка тех записей, которые Вы видите :) У Вас же проблема с теми записями, которые Ваша транзакция не видит... Имеется ввиду совсем страшная блокировка (lock table ...)

PS: А Вы тут не ошиблись, у Вас действительно:
SELECT
    my_sequence.NEXTVAL,
    ?,
    ?,
    0,
    0,
    CURRENT_TIMESTAMP
FROM
    my_table
?
24 ноя 08, 15:42    [6480584]     Ответить | Цитировать Сообщить модератору
 Re: Вставка лишних записей  [new]
SunTechNick
Member

Откуда:
Сообщений: 32
Jannny,

Да - там my_table. На самом деле в этом месте может использоваться любая таблица, так что можно читать как dummy_table.

А нельзя ли как--нибудь обойтись без блокировки всей таблицы?
Уж очень это страшно и хочется этого избежать.
24 ноя 08, 15:47    [6480626]     Ответить | Цитировать Сообщить модератору
 Re: Вставка лишних записей  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
SunTechNick
А нельзя ли как--нибудь обойтись без блокировки всей таблицы?
Уж очень это страшно и хочется этого избежать.
Ну так а ограничение уникальности на таблице?

SunTechNick
Да - там my_table. На самом деле в этом месте может использоваться любая таблица, так что можно читать как dummy_table.
Ну вообще-то имеет значение, какя именно там таблица :) В смысле сколько там записей...
24 ноя 08, 15:49    [6480643]     Ответить | Цитировать Сообщить модератору
 Re: Вставка лишних записей  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
SunTechNick
Вы имеете ввиду добавление FOR UPDATE к вложенному select'у?

Имеется в виду lock table
24 ноя 08, 15:53    [6480665]     Ответить | Цитировать Сообщить модератору
 Re: Вставка лишних записей  [new]
Andrey.L
Member

Откуда: Харьков
Сообщений: 1546
Jannny
SunTechNick
А нельзя ли как--нибудь обойтись без блокировки всей таблицы?
Уж очень это страшно и хочется этого избежать.
Ну так а ограничение уникальности на таблице?
+1
24 ноя 08, 16:08    [6480764]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить