|
|
|
Бизнес-целостность в многоуровневом приложении
|
|||
|---|---|---|---|
|
#18+
Всем привет! Давненько здесь не был, наверное, многое пропустил, но не ругайтесь, если вопрос был - подсказка не выдает, по кр. мере. Имеется стандартный слоеный пирог представление/бизнес-логика/доступ к данным. Все происходит на C# MVC3 / MS SQL 2008 R2. Вопрос такой. Я очень хотел и хочу держать бизнес-логику в предназначенном для нее слое - как это советуют разные гуру - но вот столкнулся с проблемой. Рассмотрим некую операцию - допустим, перевод денег со счета на счет. Для ее выполнения нужно проверить ряд условий: права пользователя на совершение операции, наличие денег на счете-доноре, правильность реквизитов и еще ряд каких-нить вещей. Все это, я полагаю, надо делать в слое бизнес-логики, и там же, в рамках одной транзакции (TransactionScope), совершить списание с одного счета и пополнение другого (т.е. два обращения к слою доступа к данным, в моем случае - репозиториям). Теперь представим, что приложение это ужасно высоконагруженное, и между тем моментом, как я получил сведения о счете-акцепторе (там было 100 руб.) и тем, как я в него добавил денег (+50 руб.), кто-то другой положил туда еще мильон, а я после этого записал туда свою сумму 100+50 = 150 руб, таким образом навсегда потеряв огромную кучу бабла. Вопрос, уверен, очень популярный, но у меня не получилось нагуглить внятного решения. Варианты, которые вижу: 1) Каким-то образом блокировать физическую запись в БД на изменение на все время транзакции метода бизнес-уровня. Во-первых, не знаю как, во-вторых, с учетом вытягивания записи в приложение, обработки ее и сохранения, это, видимо, займет неприлично много времени для высоконагруженного приложения. 2) Делать транзакцию в хранимке, но тогда это потянет за собой в БД часть бизнес-логики, и опять получится треш. Люди добрые, что делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2012, 11:46 |
|
||
|
Бизнес-целостность в многоуровневом приложении
|
|||
|---|---|---|---|
|
#18+
Dmitry GurianovДелать транзакцию в хранимке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2012, 11:50 |
|
||
|
Бизнес-целостность в многоуровневом приложении
|
|||
|---|---|---|---|
|
#18+
.Dmitry GurianovДелать транзакцию в хранимке И тащить туда все проверки, ибо с момента их могло что-то измениться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2012, 11:52 |
|
||
|
Бизнес-целостность в многоуровневом приложении
|
|||
|---|---|---|---|
|
#18+
Dmitry Gurianov.пропущено... И тащить туда все проверки, ибо с момента их могло что-то измениться?да бабло важнее красоты кода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2012, 11:53 |
|
||
|
Бизнес-целостность в многоуровневом приложении
|
|||
|---|---|---|---|
|
#18+
.Dmitry Gurianovпропущено... И тащить туда все проверки, ибо с момента их могло что-то измениться?да бабло важнее красоты кода Всякие хансельманы и скотты Гу не пальцем вроде деланы, чтобы ради красоты впаривать архитектуру, которая на втором шаге вызывает вопросы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2012, 11:57 |
|
||
|
Бизнес-целостность в многоуровневом приложении
|
|||
|---|---|---|---|
|
#18+
или писать сервис , который работает с вашей версией базы и таблицами виртуальных счетов, и проводит транзакции уже по факту (сервис , естественно, уже в дмз зоне) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2012, 11:58 |
|
||
|
Бизнес-целостность в многоуровневом приложении
|
|||
|---|---|---|---|
|
#18+
Dmitry Gurianov 1) Каким-то образом блокировать физическую запись в БД на изменение на все время транзакции метода бизнес-уровня. Во-первых, не знаю как, во-вторых, с учетом вытягивания записи в приложение, обработки ее и сохранения, это, видимо, займет неприлично много времени для высоконагруженного приложения. Перед началом, отметить например поле в базе IsLocked = true, что таблица заблокирована, в конце работы false. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2012, 14:01 |
|
||
|
Бизнес-целостность в многоуровневом приложении
|
|||
|---|---|---|---|
|
#18+
Dmitry Gurianov 1) Каким-то образом блокировать физическую запись в БД на изменение на все время транзакции метода бизнес-уровня. Во-первых, не знаю как, во-вторых, с учетом вытягивания записи в приложение, обработки ее и сохранения, это, видимо, займет неприлично много времени для высоконагруженного приложения. Вот очень старый вариант. Трансформируйте под себя. pkarklin ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2012, 18:43 |
|
||
|
Бизнес-целостность в многоуровневом приложении
|
|||
|---|---|---|---|
|
#18+
[quot Dmitry Gurianov]Всем привет! Давненько здесь не был, наверное, многое пропустил, но не ругайтесь, если вопрос был - подсказка не выдает, по кр. мере. Имеется стандартный слоеный пирог представление/бизнес-логика/доступ к данным. Все происходит на C# MVC3 / MS SQL 2008 R2. Вопрос такой. Я очень хотел и хочу держать бизнес-логику в предназначенном для нее слое - как это советуют разные гуру - но вот столкнулся с проблемой. Рассмотрим некую операцию - допустим, перевод денег со счета на счет. Для ее выполнения нужно проверить ряд условий: права пользователя на совершение операции, наличие денег на счете-доноре, правильность реквизитов и еще ряд каких-нить вещей. Все это, я полагаю, надо делать в слое бизнес-логики, и там же, в рамках одной транзакции (TransactionScope), совершить списание с одного счета и пополнение другого (т.е. два обращения к слою доступа к данным, в моем случае - репозиториям). Теперь представим, что приложение это ужасно высоконагруженное, и между тем моментом, как я получил сведения о счете-акцепторе (там было 100 руб.) и тем, как я в него добавил денег (+50 руб.), кто-то другой положил туда еще мильон, а я после этого записал туда свою сумму 100+50 = 150 руб, таким образом навсегда потеряв огромную кучу бабла. Вопрос, уверен, очень популярный, но у меня не получилось нагуглить внятного решения. Варианты, которые вижу: 1) Каким-то образом блокировать физическую запись в БД на изменение на все время транзакции метода бизнес-уровня. Во-первых, не знаю как, во-вторых, с учетом вытягивания записи в приложение, обработки ее и сохранения, это, видимо, займет неприлично много времени для высоконагруженного приложения. 2) Делать транзакцию в хранимке, но тогда это потянет за собой в БД часть бизнес-логики, и опять получится треш. а перед апдейтом записи проверить счет-акцептор равны ли те 100 рублей что у тебя, тем данным что там? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2012, 19:54 |
|
||
|
Бизнес-целостность в многоуровневом приложении
|
|||
|---|---|---|---|
|
#18+
авторТеперь представим, что приложение это ужасно высоконагруженное, и между тем моментом, как я получил сведения о счете-акцепторе (там было 100 руб.) и тем, как я в него добавил денег (+50 руб.), кто-то другой положил туда еще мильон, а я после этого записал туда свою сумму 100+50 = 150 руб, таким образом навсегда потеряв огромную кучу бабла. гыгы... вообще-то состояние счёта на текущий момет - БАЛАНС - величина вполне себе виртуальная и, складывается из РЕАЛЬНЫХ (прихода-расхода) величин на опр. момент времени... как бэ твои 50 рэ - записываются не 100(баланс на тек. момент) + 50(приход) = 150(новый баланс на тек. момент) руб а записываем 50(приход!) и, далее расчитываем (новый баланс на тек. момент)=(приход) - (расход) - (за период!) так что конкретный пример ИМХО не вполне удачен для обозначеной тобою проблемы! авторПеред началом, отметить например поле в базе IsLocked = true, что таблица заблокирована, в конце работы false. REVISION - (к примеру GUID) - сделали апдейт записи - GUID поменялся! для лучшего понимания кусочек промо-кода (пишу от балды, для осознания тобою логики;) Код: c# 1. 2. 3. 4. 5. 6. 7. где и как ты разместишь подобную логику (в ХП, в приложении или где-то ещё) - дело твоё - это всего пример! Успехов! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2012, 23:57 |
|
||
|
Бизнес-целостность в многоуровневом приложении
|
|||
|---|---|---|---|
|
#18+
Dezaа перед апдейтом записи проверить счет-акцептор равны ли те 100 рублей что у тебя, тем данным что там? то есть. дублировать логику или просто нести ее в бД - от чего и требовалось отказаться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2012, 10:55 |
|
||
|
Бизнес-целостность в многоуровневом приложении
|
|||
|---|---|---|---|
|
#18+
баланс гыгы... вообще-то состояние счёта на текущий момет - БАЛАНС - величина вполне себе виртуальная и, складывается из РЕАЛЬНЫХ (прихода-расхода) величин на опр. момент времени... ... (к примеру GUID) - сделали апдейт записи - GUID поменялся! Насчет примера - верно, не очень пример. Хотя у меня и происходит нечто типа накопления операций, и "баланс" выводится по ним, тем не менее, я буду хранить отдельно фикс, ибо транзакций предполагается много и со временем все станет тормозить. Другое дело, пересмотрю структуру данных, чтоб не пришлось городить костыли и не было места для рассинхронизаций. Спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2012, 11:03 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=37752561&tid=1359711]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
50ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 254ms |
| total: | 389ms |

| 0 / 0 |
