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); }
//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); }