Loading...
petrovaliev95 avatar petrovaliev95 358 Точки

[Homework] Database Apps - Transactions in EF

Дойде ред и на това домашно. ЦЪК

Като цяло домашното не беше трудно, но имаше някои неща които може да се направят по няколко начина и трябва ние да мислим как да ги направим. Надяваме се да съм ги имплементирал по добър начин.

Тези неща са :

  1. Problem 2. В този случай не може да има повече от 2 конфликта, но ако има може да се направи да работи рекурсивно.

  2. Problem 5. Този метод "Withdrawal" може да се имплементира като част от "CardAccount" класа (тоест да можеш да му извикаш 'peshoAccount.Withdrawal(500)' ) аз го направих с DAO клас.

  3. Problem 6. Много се чудих има ли смисъл да правя foreign key м/у 2-те таблици и го оставих без.

Ако някой има някакви препоръки да драсне по един коментар.

Поздрави,
Даниел Петровалиев

Тагове:
5
Advanced Level: Back-End
borislavml avatar borislavml 368 Точки

Наистина много интересно и пипкаво е с тези транзакции. Трябва да тестваш като луд до дупка какво става и какво не. NewsSystem аз я направих с try catch и рекурсивно извикване при ексепшън в catcha. Пробвах го с три отворени конзоли и мисля, че всичко върви както трябва. ЦЪК

АТМ-а и мен ме беше страх да слагам foreign key-ове в TransactionHistory. Знам ли го EF дали няма да изписка, а и не ми се струва правилно да има foreign key-ове в таблица с логове.Такив таблици мисля един вид не са част от работещата логика на базата и приложението, и ако ги връзваме с ключове може да имаме излишни главоболия.

Както си сетваш транзакцията в using-a може да подадеш IsolationLevel.RepeatableRead, за да не може друг да чете и тегли от тази карта докато тече текущата танзакция. През конзолата е трудно за симулация защото тябва да се пише метод който да ти иска пин и сума последователно, за да можеш паралелно да отвориш нова конзола и да теглиш пари и там. Но го тествах с брейк поинт и през management studio. Със сетнат IsolationLevel.RepeatableRead докато тече транзакцията, в 

management studio не мога да едитвам сумата на конкретния ред. Би трябвало и през приложението да работи. А за логовете, мисля че е по-добре да извикаш LogWithdrawalTransaction(cardNumber, amount) накрая след save и commit, за всеки случай,въпреки че ako имао exception, той така или иначе ще е гръмнал преди това и не би трябвало да логне.smile Ето моя код за АТМ-а ЦЪК

4
petrovaliev95 avatar petrovaliev95 358 Точки

Като цяло си е голяма играчка да хванеш всички случаи на приложението за това е хубаво да тестваш всичко за което се сетиш. Рекурсията решава този проблем за който съм споменал както и ти си го направил, но за целта на домашното имаме 2-ма юзъри и мисля, че моето демо работи. Разгледах кода ти. При тебе е нужно да стартираш 2-пъти приложението за да направиш конфликт. Можеш да го направиш както пише в условието, както и Наков показа да стане автоматичен конфликт :D. Иначе благодаря за препоръките не бях се замислял за логването и isolationLevel-а.

0
12/03/2015 14:51:25
ZvetanIG avatar ZvetanIG 907 Точки

Дани във 2 задача изобщо нямаш нужда от рекурсии. Просто използваш един  do {} while  и си готов.

За задача 6 си прав изобщо няма смисъл от foreign key (Ако евентуално се сложи - въпросът е по кои колони).

5 задача по мое мнение не е домислена. Тя спокойно може да се направи по стандартния начин, защото операциите с базата са такива, че имаме само едно ъпдейтване и вкрайна сметка при хвърляне на ексепшън изобщо не се стига до моментa с ъпдейтването. (А може и просто да не разбирам напълно условието.)

Ето и моето домашно.

1
15/03/2015 20:43:01
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.