2015-05-26 7 views
0

Taskсделки и процедуры в Oracle

Пользователь может собрать только ONE бонус РАЗ на сайте в день. Структура сервера

:

  • два веб-сервера
  • одна база данных

Эти два веб-сервера развернуты с тем же кодом и подключены к одной и той же базе данных.

Запросы случайным образом направляются на один из веб-серверов.

То, что я

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

Я использую @Transactional в Spring Framework в надежде сделать процедуру, которую я написал транзакционной в БД.

Проблема

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

Помощь

Таким образом, от того, что я понимаю, @Transactional в Spring Framework блоков доступа к коду к БД, но не БД напрямую? Пользователи с сервера A все еще могут иметь доступ к таблицам в БД, когда сервер B запускает методы, аннотированные с помощью @Transactional?

И как я могу использовать транзакцию в хранимой процедуре в Oracle?

Заранее спасибо.

ответ

0

Каждое соединение с Oracle - это транзакция; он неявный в Oracle, в отличие от SQL Server, где вам нужно указать begin trans. Если у вас есть веб-ферма/сад, напрямую подключающийся к базе данных, а переключатель балансировки нагрузки отправляет запрос A, а затем B на веб-сервер 1 и 2, вы получите две транзакции против базы данных. По умолчанию уровень изоляции Oracle установлен как прочитанный. Если у вас есть что-то в запросе сохраненного proc, чтобы проверить, был ли бонус применен, вы хотите выбрать обновление для блокировки строки, чтобы другая транзакция была заблокирована от чтения строки до тех пор, пока другая транзакция не завершит обновление. Кроме того, рассмотрели ли вы использование каких-либо сеансов, чтобы каждый сеанс был прикреплен к одному веб-серверу? В противном случае я рассмотрел бы использование некоторого кода среднего уровня после шаблона CQRS в качестве другой альтернативы до отправки запросов в базу данных: http://blog.trifork.com/2010/01/27/cqrs-designing-domain-events/

+0

Да, вы правы. Спасибо. –

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