2009-09-03 3 views
1

Я работаю с вашим типичным трехслойным приложением, которое имеет слой презентации, бизнес-уровень и слой DAO. Это веб-приложение Java, которое использует Spring MVC, Spring Security и управление транзакциями Spring из бизнес-уровня. Он взаимодействует с базой данных Oracle 10g.Родительский ключ не найден - Управление транзакциями весны

У меня есть метод бизнес-уровня, называемый createDepartment. Внутри этого метода я делаю два вызова слоя DAO для создания отдела и создания позиции для этого отдела. Каждый раз, когда я это делаю, я получаю исключение родительского ключа, если не предпринимается попытка создать позицию. Если я перемещаю createPosition до уровня представления (вне управления транзакциями), он работает.

Я могу дублировать это в SQL-разработчике Oracle. Если я создаю отдел, я не могу увидеть этот отдел, пока не закрою соединение и не получу новый, поэтому я могу понять, почему позиция не может быть создана. Что отличает его от большинства вложений SQL, так это то, что приложение использует функцию безопасности ярлыков Oracle, и всем отделам присваивается метка. Поэтому, когда создается отдел, создается новый ярлык.

Как я могу сделать отдел видимым в соединении, которое он использует для его создания?

+0

Я хочу упомянуть, что создание метки является неявным фиксацией. Я точно не знаю, как это влияет на управление транзакциями. –

ответ

2

Мне кажется, что вызов DAO для создания «позиции» фактически работает с другим соединением и/или транзакцией с вызовом DAO, который создает отдел. Это соответствовало бы с наблюдениями:

  • Когда отдел создается внутри транзакции, а затем делается попытка создать позицию в другой сделке, сделка, которая создала отдел до сих пор не совершил, и поэтому он терпит неудачу.
  • Когда отдел создается вне транзакции DAO, он получает фиксацию, а затем позиция создается ОК.

Убедитесь, что у вас есть только одна граница транзакции в вашем DAO и убедитесь, что вызов для создания позиции не вызывает непреднамеренно создание новой транзакции или соединения. Ведение журнала Spring debyug очень полезно для отслеживания этого, это очень многословно о каждом соединении get/release и tx start/end border.

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