示例#1
0
        public bool UpdateBalance(Account account, Transaction historyTransaction)
        {
            DbConnection.Instance().OpenConnection();                                // đảm bảo rằng đã kết nối đến db thành công.
            var transaction = DbConnection.Instance().Connection.BeginTransaction(); // Khởi tạo transaction.

            try
            {
                /**
                 * 1. Lấy thông tin số dư mới nhất của tài khoản.
                 * 2. Kiểm tra kiểu transaction. Chỉ chấp nhận deposit và withdraw.
                 *     2.1. Kiểm tra số tiền rút nếu kiểu transaction là withdraw.
                 * 3. Update số dư vào tài khoản.
                 *     3.1. Tính toán lại số tiền trong tài khoản.
                 *     3.2. Update số tiền vào database.
                 * 4. Lưu thông tin transaction vào bảng transaction.
                 */

                // 1. Lấy thông tin số dư mới nhất của tài khoản.
                var          queryBalance        = "select balance from `accounts` where username = @username and status = @status";
                MySqlCommand queryBalanceCommand = new MySqlCommand(queryBalance, DbConnection.Instance().Connection);
                queryBalanceCommand.Parameters.AddWithValue("@username", account.Username);
                queryBalanceCommand.Parameters.AddWithValue("@status", account.Status);
                var balanceReader = queryBalanceCommand.ExecuteReader();
                // Không tìm thấy tài khoản tương ứng, throw lỗi.
                if (!balanceReader.Read())
                {
                    // Không tồn tại bản ghi tương ứng, lập tức rollback transaction, trả về false.
                    // Hàm dừng tại đây.
                    throw new SpringHeroTransactionException("Invalid username");
                }

                // Đảm bảo sẽ có bản ghi.
                var currentBalance = balanceReader.GetDecimal("balance");
                balanceReader.Close();

                // 2. Kiểm tra kiểu transaction. Chỉ chấp nhận deposit và withdraw.
                if (historyTransaction.Type != Transaction.TransactionType.DEPOSIT &&
                    historyTransaction.Type != Transaction.TransactionType.WITHDRAW)
                {
                    throw new SpringHeroTransactionException("Invalid transaction type!");
                }

                // 2.1. Kiểm tra số tiền rút nếu kiểu transaction là withdraw.
                if (historyTransaction.Type == Transaction.TransactionType.WITHDRAW &&
                    historyTransaction.Amount > currentBalance)
                {
                    throw new SpringHeroTransactionException("Not enough money!");
                }

                // 3. Update số dư vào tài khoản.
                // 3.1. Tính toán lại số tiền trong tài khoản.
                if (historyTransaction.Type == Transaction.TransactionType.DEPOSIT)
                {
                    currentBalance += historyTransaction.Amount;
                }
                else
                {
                    currentBalance -= historyTransaction.Amount;
                }

                // 3.2. Update số dư vào database.
                var updateAccountResult       = 0;
                var queryUpdateAccountBalance =
                    "update `accounts` set balance = @balance where username = @username and status = 1";
                var cmdUpdateAccountBalance =
                    new MySqlCommand(queryUpdateAccountBalance, DbConnection.Instance().Connection);
                cmdUpdateAccountBalance.Parameters.AddWithValue("@username", account.Username);
                cmdUpdateAccountBalance.Parameters.AddWithValue("@balance", currentBalance);
                updateAccountResult = cmdUpdateAccountBalance.ExecuteNonQuery();

                // 4. Lưu thông tin transaction vào bảng transaction.
                var insertTransactionResult = 0;
                var queryInsertTransaction  = "insert into `transactions` " +
                                              "(id, type, amount, content, senderAccountNumber, receiverAccountNumber, status) " +
                                              "values (@id, @type, @amount, @content, @senderAccountNumber, @receiverAccountNumber, @status)";
                var cmdInsertTransaction =
                    new MySqlCommand(queryInsertTransaction, DbConnection.Instance().Connection);
                cmdInsertTransaction.Parameters.AddWithValue("@id", historyTransaction.Id);
                cmdInsertTransaction.Parameters.AddWithValue("@type", historyTransaction.Type);
                cmdInsertTransaction.Parameters.AddWithValue("@amount", historyTransaction.Amount);
                cmdInsertTransaction.Parameters.AddWithValue("@content", historyTransaction.Content);
                cmdInsertTransaction.Parameters.AddWithValue("@senderAccountNumber",
                                                             historyTransaction.SenderAccountNumber);
                cmdInsertTransaction.Parameters.AddWithValue("@receiverAccountNumber",
                                                             historyTransaction.ReceiverAccountNumber);
                cmdInsertTransaction.Parameters.AddWithValue("@status", historyTransaction.Status);
                insertTransactionResult = cmdInsertTransaction.ExecuteNonQuery();

                if (updateAccountResult == 1 && insertTransactionResult == 1)
                {
                    transaction.Commit();
                    return(true);
                }
            }
            catch (SpringHeroTransactionException e)
            {
                transaction.Rollback();
                return(false);
            }

            DbConnection.Instance().CloseConnection();
            return(false);
        }
示例#2
0
        //viết transaction cho TRANSFER
        public bool UpdateBalanceTransfer(Account accountGui, Account accountNhan, Transaction historyTransaction)
        {
            DbConnection.Instance().OpenConnection();
            var transaction = DbConnection.Instance().Connection.BeginTransaction();

            try
            {
                //NGƯỜI GỬI

                //  Lấy thông tin số dư mới nhất của tài khoản người gửi.

                var queryBalance = "select balance from `accounts` where username = @username and status = @status";

                MySqlCommand queryBalanceCommand = new MySqlCommand(queryBalance, DbConnection.Instance().Connection);

                queryBalanceCommand.Parameters.AddWithValue("@username", accountGui.Username);

                queryBalanceCommand.Parameters.AddWithValue("@status", accountGui.Status);

                var balanceReader = queryBalanceCommand.ExecuteReader();



                if (!balanceReader.Read())

                {
                    // Không tồn tại bản ghi tương ứng, lập tức rollback transaction, trả về false.

                    // Hàm dừng tại đây.

                    throw new SpringHeroTransactionException("Invalid username");
                }

                // Đảm bảo sẽ có bản ghi.
                var currentBalance = balanceReader.GetDecimal("balance");

                balanceReader.Close();

                // 2. Kiểm tra kiểu transaction. Chỉ chấp nhận transfer.
                if (historyTransaction.Type != Transaction.TransactionType.TRANSFER)
                {
                    throw new TransactionException("Not enough money");
                }

                // 3. Update số dư vào tài khoản.
                // 3.1. Tính toán lại số tiền trong tài khoản.
                if (historyTransaction.Type == Transaction.TransactionType.TRANSFER)
                {
                    currentBalance -= historyTransaction.Amount;
                }

                // 3.2. Update số dư người gửi vào database.
                var updateSenderAccountResult       = 0;
                var queryUpdateSenderAccountBalance =
                    "update `accounts` set balance = @balance where username = @username and status = 1";
                var cmdUpdateSenderAccountBalance =
                    new MySqlCommand(queryUpdateSenderAccountBalance, DbConnection.Instance().Connection);
                cmdUpdateSenderAccountBalance.Parameters.AddWithValue("@username", accountGui.Username);
                cmdUpdateSenderAccountBalance.Parameters.AddWithValue("@balance", currentBalance);
                updateSenderAccountResult = cmdUpdateSenderAccountBalance.ExecuteNonQuery();

                //NGƯỜI NHẬN
                //  Lấy thông tin số dư mới nhất của tài khoản người nhận.
                queryBalance        = "select balance from `accounts` where username = @username and status = @status";
                queryBalanceCommand = new MySqlCommand(queryBalance, DbConnection.Instance().Connection);
                queryBalanceCommand.Parameters.AddWithValue("@username", accountNhan.Username);
                queryBalanceCommand.Parameters.AddWithValue("@status", accountNhan.Status);

                balanceReader = queryBalanceCommand.ExecuteReader();
                if (!balanceReader.Read())
                {
                    // Không tồn tại bản ghi tương ứng, lập tức rollback transaction, trả về false.
                    // Hàm dừng tại đây.
                    throw new TransactionException("Invalid username");
                }

                // Đảm bảo sẽ có bản ghi.
                currentBalance = balanceReader.GetDecimal("balance");
                balanceReader.Close();
                // 2. Kiểm tra kiểu transaction. Chỉ chấp nhận transfer.
                if (historyTransaction.Type != Transaction.TransactionType.TRANSFER)
                {
                    throw new TransactionException("Not enough money");
                }

                // 3. Update số dư vào tài khoản.
                // 3.1. Tính toán lại số tiền trong tài khoản người nhận.
                if (historyTransaction.Type == Transaction.TransactionType.TRANSFER)
                {
                    currentBalance += historyTransaction.Amount;
                }

                // 3.2. Update số dư người nhận vào database.
                var updateReceiverAccountResult       = 0;
                var queryUpdateReceiverAccountBalance =
                    "update `accounts` set balance = @balance where username = @username and status = 1";
                var cmdUpdateReceiverAccountBalance =
                    new MySqlCommand(queryUpdateReceiverAccountBalance, DbConnection.Instance().Connection);
                cmdUpdateReceiverAccountBalance.Parameters.AddWithValue("@username", accountNhan.Username);
                cmdUpdateReceiverAccountBalance.Parameters.AddWithValue("@balance", currentBalance);
                updateReceiverAccountResult = cmdUpdateReceiverAccountBalance.ExecuteNonQuery();

                // 4. Lưu thông tin transaction vào bảng transaction.
                var insertTransactionResult = 0;
                var queryInsertTransaction  = "insert into `transactions` " +
                                              "(id, type, amount, content, senderAccountNumber, receiverAccountNumber, status) " +
                                              "values (@id, @type, @amount, @content, @senderAccountNumber, @receiverAccountNumber, @status)";
                var cmdInsertTransaction = new MySqlCommand(queryInsertTransaction, DbConnection.Instance().Connection);
                cmdInsertTransaction.Parameters.AddWithValue("@id", historyTransaction.Id);
                cmdInsertTransaction.Parameters.AddWithValue("@type", historyTransaction.Type);
                cmdInsertTransaction.Parameters.AddWithValue("@amount", historyTransaction.Amount);
                cmdInsertTransaction.Parameters.AddWithValue("@content", historyTransaction.Content);
                cmdInsertTransaction.Parameters.AddWithValue("@senderAccountNumber", historyTransaction.SenderAccountNumber);
                cmdInsertTransaction.Parameters.AddWithValue("@receiverAccountNumber", historyTransaction.ReceiverAccountNumber);
                cmdInsertTransaction.Parameters.AddWithValue("@status", historyTransaction.Status);
                insertTransactionResult = cmdInsertTransaction.ExecuteNonQuery();
                if (updateSenderAccountResult == 1 && updateReceiverAccountResult == 1 && insertTransactionResult == 1)
                {
                    transaction.Commit();
                    return(true);
                }
            }
            catch (TransactionException e)
            {
                transaction.Rollback();
                return(false);
            }
            DbConnection.Instance().CloseConnection();
            return(false);
        }