powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Бизнес-целостность в многоуровневом приложении
13 сообщений из 13, страница 1 из 1
Бизнес-целостность в многоуровневом приложении
    #37750090
Dmitry Gurianov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Давненько здесь не был, наверное, многое пропустил, но не ругайтесь, если вопрос был - подсказка не выдает, по кр. мере.

Имеется стандартный слоеный пирог представление/бизнес-логика/доступ к данным. Все происходит на C# MVC3 / MS SQL 2008 R2.
Вопрос такой. Я очень хотел и хочу держать бизнес-логику в предназначенном для нее слое - как это советуют разные гуру - но вот столкнулся с проблемой.
Рассмотрим некую операцию - допустим, перевод денег со счета на счет. Для ее выполнения нужно проверить ряд условий: права пользователя на совершение операции, наличие денег на счете-доноре, правильность реквизитов и еще ряд каких-нить вещей. Все это, я полагаю, надо делать в слое бизнес-логики, и там же, в рамках одной транзакции (TransactionScope), совершить списание с одного счета и пополнение другого (т.е. два обращения к слою доступа к данным, в моем случае - репозиториям).
Теперь представим, что приложение это ужасно высоконагруженное, и между тем моментом, как я получил сведения о счете-акцепторе (там было 100 руб.) и тем, как я в него добавил денег (+50 руб.), кто-то другой положил туда еще мильон, а я после этого записал туда свою сумму 100+50 = 150 руб, таким образом навсегда потеряв огромную кучу бабла.
Вопрос, уверен, очень популярный, но у меня не получилось нагуглить внятного решения.

Варианты, которые вижу:

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

Люди добрые, что делать?
...
Рейтинг: 0 / 0
Бизнес-целостность в многоуровневом приложении
    #37750104
.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.
Гость
Dmitry GurianovДелать транзакцию в хранимке
...
Рейтинг: 0 / 0
Бизнес-целостность в многоуровневом приложении
    #37750115
Dmitry Gurianov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Dmitry GurianovДелать транзакцию в хранимке

И тащить туда все проверки, ибо с момента их могло что-то измениться?
...
Рейтинг: 0 / 0
Бизнес-целостность в многоуровневом приложении
    #37750119
.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.
Гость
Dmitry Gurianov.пропущено...


И тащить туда все проверки, ибо с момента их могло что-то измениться?да
бабло важнее красоты кода
...
Рейтинг: 0 / 0
Бизнес-целостность в многоуровневом приложении
    #37750137
Dmitry Gurianov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Dmitry Gurianovпропущено...


И тащить туда все проверки, ибо с момента их могло что-то измениться?да
бабло важнее красоты кода

Всякие хансельманы и скотты Гу не пальцем вроде деланы, чтобы ради красоты впаривать архитектуру, которая на втором шаге вызывает вопросы...
...
Рейтинг: 0 / 0
Бизнес-целостность в многоуровневом приложении
    #37750140
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или писать сервис , который работает с вашей версией базы и таблицами виртуальных счетов, и проводит транзакции уже по факту (сервис , естественно, уже в дмз зоне)
...
Рейтинг: 0 / 0
Бизнес-целостность в многоуровневом приложении
    #37750514
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Gurianov
1) Каким-то образом блокировать физическую запись в БД на изменение на все время транзакции метода бизнес-уровня. Во-первых, не знаю как, во-вторых, с учетом вытягивания записи в приложение, обработки ее и сохранения, это, видимо, займет неприлично много времени для высоконагруженного приложения.

Перед началом, отметить например поле в базе IsLocked = true, что таблица заблокирована, в конце работы false.
...
Рейтинг: 0 / 0
Бизнес-целостность в многоуровневом приложении
    #37751146
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Gurianov
1) Каким-то образом блокировать физическую запись в БД на изменение на все время транзакции метода бизнес-уровня. Во-первых, не знаю как, во-вторых, с учетом вытягивания записи в приложение, обработки ее и сохранения, это, видимо, займет неприлично много времени для высоконагруженного приложения.

Вот очень старый вариант.
Трансформируйте под себя.
pkarklin
...
Рейтинг: 0 / 0
Бизнес-целостность в многоуровневом приложении
    #37751240
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Dmitry Gurianov]Всем привет!
Давненько здесь не был, наверное, многое пропустил, но не ругайтесь, если вопрос был - подсказка не выдает, по кр. мере.

Имеется стандартный слоеный пирог представление/бизнес-логика/доступ к данным. Все происходит на C# MVC3 / MS SQL 2008 R2.
Вопрос такой. Я очень хотел и хочу держать бизнес-логику в предназначенном для нее слое - как это советуют разные гуру - но вот столкнулся с проблемой.
Рассмотрим некую операцию - допустим, перевод денег со счета на счет. Для ее выполнения нужно проверить ряд условий: права пользователя на совершение операции, наличие денег на счете-доноре, правильность реквизитов и еще ряд каких-нить вещей. Все это, я полагаю, надо делать в слое бизнес-логики, и там же, в рамках одной транзакции (TransactionScope), совершить списание с одного счета и пополнение другого (т.е. два обращения к слою доступа к данным, в моем случае - репозиториям).
Теперь представим, что приложение это ужасно высоконагруженное, и между тем моментом, как я получил сведения о счете-акцепторе (там было 100 руб.) и тем, как я в него добавил денег (+50 руб.), кто-то другой положил туда еще мильон, а я после этого записал туда свою сумму 100+50 = 150 руб, таким образом навсегда потеряв огромную кучу бабла.
Вопрос, уверен, очень популярный, но у меня не получилось нагуглить внятного решения.

Варианты, которые вижу:

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

а перед апдейтом записи проверить счет-акцептор равны ли те 100 рублей что у тебя, тем данным что там?
...
Рейтинг: 0 / 0
Бизнес-целостность в многоуровневом приложении
    #37751484
баланс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторТеперь представим, что приложение это ужасно высоконагруженное, и между тем моментом, как я получил сведения о счете-акцепторе (там было 100 руб.) и тем, как я в него добавил денег (+50 руб.), кто-то другой положил туда еще мильон, а я после этого записал туда свою сумму 100+50 = 150 руб, таким образом навсегда потеряв огромную кучу бабла.
гыгы... вообще-то состояние счёта на текущий момет - БАЛАНС - величина вполне себе виртуальная и, складывается из РЕАЛЬНЫХ (прихода-расхода) величин на опр. момент времени...

как бэ твои 50 рэ - записываются не 100(баланс на тек. момент) + 50(приход) = 150(новый баланс на тек. момент) руб
а записываем 50(приход!) и, далее расчитываем (новый баланс на тек. момент)=(приход) - (расход) - (за период!)

так что конкретный пример ИМХО не вполне удачен для обозначеной тобою проблемы!

авторПеред началом, отметить например поле в базе IsLocked = true, что таблица заблокирована, в конце работы false.
REVISION - (к примеру GUID) - сделали апдейт записи - GUID поменялся!
для лучшего понимания кусочек промо-кода (пишу от балды, для осознания тобою логики;)
Код: c#
1.
2.
3.
4.
5.
6.
7.
UPDATE table SET lalala=trololo, lololo=gugugu
WHERE id = id AND rev = rev
IF @@ROWCOUNT <> 0
BEGIN
   UPDATE table SET rev=newGUID
   WHERE id = id
END


где и как ты разместишь подобную логику (в ХП, в приложении или где-то ещё) - дело твоё - это всего пример!

Успехов!
...
Рейтинг: 0 / 0
Бизнес-целостность в многоуровневом приложении
    #37751907
Dmitry Gurianov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dezaа перед апдейтом записи проверить счет-акцептор равны ли те 100 рублей что у тебя, тем данным что там?
то есть. дублировать логику или просто нести ее в бД - от чего и требовалось отказаться
...
Рейтинг: 0 / 0
Бизнес-целостность в многоуровневом приложении
    #37751927
Dmitry Gurianov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
баланс гыгы... вообще-то состояние счёта на текущий момет - БАЛАНС - величина вполне себе виртуальная и, складывается из РЕАЛЬНЫХ (прихода-расхода) величин на опр. момент времени...
...
(к примеру GUID) - сделали апдейт записи - GUID поменялся!


Насчет примера - верно, не очень пример. Хотя у меня и происходит нечто типа накопления операций, и "баланс" выводится по ним, тем не менее, я буду хранить отдельно фикс, ибо транзакций предполагается много и со временем все станет тормозить.
Другое дело, пересмотрю структуру данных, чтоб не пришлось городить костыли и не было места для рассинхронизаций. Спасибо :)
...
Рейтинг: 0 / 0
Бизнес-целостность в многоуровневом приложении
    #37752561
VIT2708
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Gurianov,

при использовании транзакций там выставляются "уровни доступа" при работе с одной операцией другие блокируются и т д если не ошибаюсь еще есть 3 состояния
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Бизнес-целостность в многоуровневом приложении
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]