Професионална програма
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 917 Точки

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

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

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

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

1
15/03/2015 20:43:01