[Databases] Домашно Transactions - ATM


6
Условие 1.Suppose you are creating a simple engine for an ATM machine. Create a new database "ATM" in SQL Server to hold the accounts of the card holders and the balance (money) for each account. Add a new table CardAccounts with the following fields: Id (int), CardNumber (char(10)), CardPIN (char(4)),
CardCash (money)

Add a few sample records in the table.

2.Using transactions write a method which retrieves some money (for example $200) from certain account. The retrieval is successful when the following sequence of sub-operations is completed successfully:
­A query checks if the given CardPIN and CardNumber are valid.
­The amount on the account (CardCash) is evaluated to see whether it is bigger than the requested sum (more than $200).
­The ATM machine pays the required sum (e.g. $200) and stores in the table CardAccounts the new amount (CardCash = CardCash - 200).

Why does the isolation level need to be set to “repeatable read”?

3.Extend the project from the previous exercise and add a new table TransactionsHistory with fields (Id, CardNumber, TransactionDate, Ammount) containing information about all money retrievals on all accounts.

Modify the program logic so that it saves historical information (logs) in the new table after each successful money withdrawal.

What should the isolation level be for the transaction?


Здравейте колеги,
тази задачка ми се видя доста интересна и реших да се позабавлявам с нея.

Обаче ми изникнаха някакви въпроси и ще се радвам да ги обсъдим.
Ето от тук можете да видите начална версия на задачата: https://github.com/plamenyovchev/Transactions

Въпроса е как точно да стане валидацията на самата карта, защото както съм го направил сега ми се струва, че картата се валидира два пъти.
И на задача 3, историята на транзакциите в момента на тегленето ли да се записва в същия метод WithdrawMoney?




Отговори



3

Решение

Използвал съм Code First подхода. Кода по транзакциите ми е в ATMActions.cs. При всяко успешно теглене правя запис в таблицата Transactions. Нивото на изолация е RepeatableRead.

Plamen 태권도 Yovchev - Моят съвет е първо да махнеш тези региони, защото се използват най-вече за скриване на грозен код, и да нацепиш нещата по класове. Също така добави и TransacionScope в момента не изпълняваш алгоритъмът за проверка във втора задача като една транзакция и може да се направи номера с тегленето едновременно.

 

А някой на оправи ли се с тестването на withdraw метода? Получава се състезателен сценарии при повече от един тест и реших да го оставя така, за да мога да си напиша другите домашни... При тестването на записите за транзакции няма такъв проблем.


от georgi.ivanov (3261 точки)


0

Plamen 태권도 Yovchev

Изглежда добре направено. Обаче ми се струва че никъде не си ползвал TransactionScope, а си мисля че целта беше точно да се упражнят различните нива на достъп


от stann1 (1378 точки)


0

Виждам че си ползвал няколко connections първо за да провериш дали има достатъчно пара и после за да я изтеглиш. Хубаво, но не е ли по-добре -

  • старт трансакция
  • взимаш картата която има този пин и този номер
  • проверяваш наличността и ако има достатъчно
    • теглиш
    • записваш нова транзакция в лога
    • записваш промените
    • завършваш транзакцията

Така само ако са изпълнени всички условия ще стане транзакция - ако не съвпадне пин или номер карта или няма достатъчно пара - просто няма да стигне до завършване на транзакция. Така използваш само една connection и една транзакция. Може метода ад връща bool transactionSuccessful  за да уведомиш клиента...

едит : не позволяваш да се тегли ако ammount == sum  

 

 


от gparlakov (884 точки)


0
В условието на задачата се споменава че тегленето става само ако наличността е по голяма от теглената сума.

от stoyanov (2483 точки)

0
Хм - щом така го искат - но това беше просто странична забележчица..

от gparlakov (884 точки)


1

Ето го и моя банкомат - може да теглите докато се счупи :) Използвал съм CodeFirst като базата се инициализира при всеки старт на приложението. Логовете се запазват.

Банкомат


от neutrino (3376 точки)