1. 程式人生 > >銀行轉賬業務-使用事務

銀行轉賬業務-使用事務

銀行轉賬是是兩個賬戶之間同時進行操作的,一方賬戶資金減少的同時另外一方的資金就要增加同樣的金額。如果一方操作失敗那麼另外一方的操作就不會成功。也即是需要將這樣的兩個操作放在一個事務當中。只是這裡使用到了層的概念。既然設計到轉賬那麼肯定有一個賬戶類(DTO資料傳輸物件),還有一個類是專門用來訪問該賬戶的(DAO資料訪問物件)。而我們所需要進行的轉賬操作則是可以放在服務層進行處理(service)。

DTO(資料傳輸物件)

public class Account {
    private int id;
    private String account;
    private double
cash; public Account() { } public Account(String account, double cash) { super(); this.account = account; this.cash = cash; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAccount
() { return account; } public void setAccount(String account) { this.account = account; } public double getCash() { return cash; } public void setCash(double cash) { this.cash = cash; } }
DAO(資料訪問物件)


public class AccountDAO implements BaseDAO<Account> {

    private
Connection conn; public AccountDAO(Connection conn) { this.conn = conn; } @Override public boolean insert(Account t) { return false; } @Override public boolean delete(Account t) { return false; } @Override public boolean update(Account t) { return DAOHelper.execUpdate(conn, "update tbaccount set cash = ? where account = ?", t.getCash(), t.getAccount()); } @Override public Account findById(final Account t) { return DAOHelper.queryOne("select * from tbaccount where id = ?", new CallBack<Account>() { @Override public Account getData(ResultSet rs) { try { if (rs.next()) { t.setAccount(rs.getString("account")); t.setCash(rs.getDouble("cash")); } } catch (SQLException e) { e.printStackTrace(); } return t; } }, t.getId()); } @Override public List<Account> findAll() { return null; } }
service層

public class AccountService extends BaseConn {

    // 事務
    public void transfAccount(Account a, Account b, double money) {
        Connection conn = getConn();
        // 分別查詢出A,B賬號的個子金額
        AccountDAO dao = new AccountDAO(conn);
        a = dao.findById(a);
        b = dao.findById(b);
        if ((a.getAccount() != null) && (b.getAccount() != null)) {
            // 判斷賬號a餘額是否足夠
            if (a.getCash() >= money) {
                // 減少A賬號的餘額
                a.setCash(a.getCash() - money);
                // 增加B賬號的餘額
                b.setCash(b.getCash() + money);
                try {
                    // 關閉事務自動提交
                    conn.setAutoCommit(false);
                    // 開始轉賬(這裡有問題)
                    boolean f1 = dao.update(a);
                    boolean f2 = dao.update(b);
                    if (f1 && f2) {
                        conn.commit();
                        System.out.println("轉賬成功!");
                    }
                } catch (SQLException e) {
                    try {
                        conn.rollback();
                        System.out.println("轉賬失敗");
                    } catch (SQLException e1) {
                        e1.printStackTrace();
                    }
                    e.printStackTrace();
                }

            } else {
                System.out.println("餘額不足!");
            }
        }else {
            System.out.println("賬號A或者B不存在!");
        }
    }

    public static void main(String[] args) {
        Account a = new Account();
        Account b = new Account();
        a.setId(1);
        b.setId(3);
        new AccountService().transfAccount(a, b, 1000);
    }
}

當然這裡使用了一些工具類,比如連線資料庫的類。但是主要的操作是上面的三個類。

相關推薦

銀行轉賬業務-使用事務

銀行轉賬是是兩個賬戶之間同時進行操作的,一方賬戶資金減少的同時另外一方的資金就要增加同樣的金額。如果一方操作失敗那麼另外一方的操作就不會成功。也即是需要將這樣的兩個操作放在一個事務當中。只是這裡使用到了層的概念。既然設計到轉賬那麼肯定有一個賬戶類(DTO資料傳輸

Java模擬銀行轉賬(操作事務)

第一步:建立一張銀行賬戶表 叫 BankAccount 並建立一個序列id number pk //使用者id ano varchar2(30) uk //使用者卡號 apassword varchar2(30)

Android 銀行轉賬事務

package com.example.a22_bank_transfer; import android.database.Cursor; import android.database.SQLException; import android.database.sql

JDBC事務銀行轉賬,貨物進出庫等等。

user close rman back perm 註意 ++ 加載 鏈接 1:轉賬業務  轉賬必須執行2個sql語句(update更新)都成功的情況下,提交事務,如果有一個失敗,則2個都回滾事務2:事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為A

銀行轉賬失敗到分布式事務:總結與思考

額外 nav 一般來說 以及 不執行 there 上大 區別 信息 目錄 關系型數據庫事務 分布式事務 2PC 3PC TCC 基於消息的分布式事務 1PC 思考與總結 references 正文   思考這個問題的初衷,是有一次給朋友轉賬,結果我的錢被扣

Spring事務銀行轉賬示例

參數 exe 水表 包含 strong 客戶 pub 註入 可能 https://www.imooc.com/video/9331 聲明式事務 撒打算 編程式事務 非模板式(不使用TransactionTemplate)     http://ca

Java總結(隨筆)——代碼總結JDBC以及事務,以銀行轉賬,查賬等為例

模擬銀行系統 數據庫 JDBC 事務 本片文章是對上一篇文章中的事務的例子的功能擴寫,用以加深理解,以及代碼的熟練度:(1)數據庫表數據:(2)引入數據庫連接jar包(3)工具類: package org.jdbc.util; import java.io.File; import java

17Spring事務管理的四種方式(以銀行轉賬為例)

寫這篇部落格之前我首先讀了《Spring in action》,之後在網上看了一些關於Spring事務管理的文章,感覺都沒有講全,這裡就將書上的和網上關於事務的知識總結一下,參考的文章如下: Spring事務機制詳解 Spring事務配置的五種方式 Spring中

Jdbc操作事務(提交、回滾)----以銀行轉賬為例

以銀行轉賬為例----Jdbc操作事務(提交、回滾) private Statement statement; private Connection conn; @Test public void test01() throws Exception { Class.forName("c

ThreadLocal詳解,附帶例項(threadlocal實現銀行轉賬事務管理)

一.前言   在很早之前接觸到ThreadLocal很不瞭解一件事情,就是執行緒用來處理多執行緒情景,那為什麼要用threadlocal來再為每個執行緒分發一個單獨的變數副本,是否違背多執行緒的實際存在意義,而且threadlocal是否能用同步代替?   其實

安卓SQLite資料庫事務——銀行轉賬

可以看到表中張山的錢是1800 ,李四的錢是5200, 當我們點選轉賬時,張山的錢要減去100 李四的增加100 下面開始實現步驟: 1、新建資料庫並新增表info 欄位 name phone money 。 2、佈局檔案 省略 3、主介面類 例項

MySQL資料庫事務例項(模擬銀行轉賬

在資料庫系列文章中[MySQL資料庫事務基本操作](http://blog.csdn.net/fengpojian/article/details/73571983) 介紹了MySQL資料庫基本的事務操作。這篇文章將介紹一個例項來更好的理解學習MySQL資料庫事

事務例項--銀行轉賬

首先,舉個例子:銀行(bank)中有兩個客戶(name)張三和李四我們需要將張三的1000元存款(sal)轉到李四的賬戶上我們需要怎要通過sql語句來實現這個過程update bank set sal = sal - 1000 where name = '張三';update

銀行轉賬)spring框架+jdbc+事務+Junit練習

完整專案的壓縮包在我的資源裡第一步 建立表:create table account(id int PRIMARY KEY auto_increment,name varchar(20) not nul

Spring通過事務實現模擬銀行轉賬案例

1.  案例結構 2. 所用資料庫表 3. jdbc.properties配置檔案 driver=com.mysql.jdbc.Driver url=jdbc\:mysql\://localhost\:3306/test?characterEncoding\=utf-

Jdbc來操作事物 完成模擬銀行轉賬業務

void where ace per use stat zhang ger 正常 創建JDBC工具類 1 package cn.aa4_2.JDBCUtils; 2 3 4 import java.io.FileReader; 5 import

java基礎入門-多線程同步淺析-以銀行轉賬為樣例

stat 是什麽 0.11 如何 人員 () 簡單 ret 沒有 在說之前先普及一下線程是什麽? 線程:說白了就是一個任務片段 進程:是一個具有獨立功能的程序關於某個數據集合的一次執行活動。一個進程有一個或者多個線程 線程與進程的本質差別就是有麽有數據

用python實現銀行轉賬功能

賬號 pytho exec llb 賬戶 密碼 rollback money 輸入數據 #coding:utf-8 import MySQLdb #調用MySQL數據庫模塊 conn=MySQLdb.Connect( host='.........

銀行搭建業務分析與大資料之間的快速通道

隨著銀行資訊化建設的高速發展與大量業務資料的積累,越來越多的大資料平臺也相繼搭建與發展起來。然而IT的工作變得越來越重,在維護原有資料倉庫、資料分析平臺的同時,也需要支撐大資料平臺的系統建設和應用遷移,還需要給業務部門準備各種資料和分析報表。本文將介紹最有影響力股份制銀行的資管部門如何利用KAP智慧

python配置MySQL(下)python銀行轉賬例項

python銀行轉賬例項 基於慕課網瘋狂的螞蟻crazyant講師學習python MYSQL操作,例項執行成功。 程式碼流程: 建立表: 1、語句執行(出錯) 2、視覺化操作: (引擎設定為InnoDB, 不能設為MYISAM。因為MYISAM不支援事務操作,導致事務無法回