Видимость заявлений в связи с транзакцией? - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть вопрос о видимости данных в представлениях базы данных. Я использую Oracle. У меня есть таблица myscheme.users и таблица global.users (myscheme и global являются схемами) В глобальной схеме есть представление "globalusers", которое объединяет обе пользовательские таблицы.

У меня есть Java-приложение, которое вставляет нового пользователя в таблицу myscheme.users. После этого он выполняет запрос для нового пользователя в представлении globalusers для загрузки вновь созданного пользователя. Как все это происходит внутри одной транзакции. Теперь у меня вопрос: почему вновь созданный пользователь виден в таблице myscheme.user, а не в представлении globalusers? Когда транзакция была закрыта, пользователь также находится в представлении globaluser.

Мое приложение работает внутри JBoss 5, используя hibernate.

Вид определяется следующим образом:

CREATE OR REPLACE VIEW V_USERACCOUNT AS
    SELECT u.USERACCOUNT_ID,u.USERNAME,u.INITIALS,u.COMMONNAME,u.PASSWORD,'local' AS source
        FROM "USERACCOUNT" u
    UNION
        SELECT u1.USERACCOUNT_ID,u1.USERNAME,u1.INITIALS,u1.COMMONNAME,u1.PASSWORD 'global' AS source
        FROM GLOBAL."USERACCOUNT" u1

1 Ответ

2 голосов
/ 12 сентября 2011

Если INSERT в таблице и SELECT в представлении, фактически являются частью одной и той же транзакции базы данных (что обязательно подразумевает, что они выполняются в одном сеансе базы данных), вновь вставленная строка будет быть видимым в представлении (при условии, что строка соответствует всем критериям, которые используется в представлении для определения отображаемых строк). Если нового пользователя нет в представлении, это означает, что либо

  1. INSERT и SELECT не являются частью одной транзакции базы данных, или
  2. INSERT недостаточно для того, чтобы строка была доступна в представлении. Возможно, есть какая-то другая таблица поиска, объединенная в представлении, в которой нет данных для новой строки при запросе представления, но поиск заполняется позже в транзакции.
  3. У вас есть ошибка где-то в вашем коде, когда INSERT на самом деле не происходит, когда вы думаете, что это происходит, или запрос не выполняется после INSERT, или запрос фактически не попадает в опубликованное вами представление .

Судя по вашему последнему обновлению, проблема № 1 почти наверняка является проблемой. Если у вас разные источники данных, INSERT использует один источник данных, а SELECT использует второй источник данных, эти две операции не происходят в одной транзакции базы данных. Они могут происходить в одной и той же транзакции сервера приложений - сервер приложений вполне может создавать распределенную транзакцию - но если это не та же транзакция базы данных, вы не сможете увидеть незафиксированные изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...