JDBC事务处理、提交、回滚。


package com.softeem.bank.dao;

import java.util.List;

public interface BaseDAO<T> {
    public boolean insert(T t);

    public boolean delete(T t);

    public boolean update(T t);

    public List<T> findAll();
    public T findById(T t);

}

package com.softeem.bank.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import com.softeem.bank.dto.Account;
import com.softeem.utils.DAOHelper;
import com.softeem.utils.DAOHelper.CallBack;

public class AccountDAO implements BaseDAO<Account>{

    private Connection conn;

    public AccountDAO(Connection conn) {
        this.conn = conn;
    }

    @Override
    public boolean insert(Account t) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean delete(Account t) {
        // TODO Auto-generated method stub
        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.execQueryOne("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() {
        // TODO Auto-generated method stub
        return null;
    }

}

package com.softeem.bank.dto;

public class Account {

    private int id;
    private String account;
    private double cash;

    public Account() {
        // TODO Auto-generated constructor stub
    }

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

    @Override
    public String toString() {
        return "Account [id=" + id + ", account=" + account + ", cash=" + cash + "]";
    }


}
package com.softeem.bank.service;

import java.sql.Connection;
import java.sql.SQLException;

import com.softeem.bank.dao.AccountDAO;
import com.softeem.bank.dto.Account;
import com.softeem.utils.BaseConn;


/**
 * 业务逻辑层
 * @author mrchai
 *
 */
public class AccountService extends BaseConn{

    //事务
    public synchronized 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);
//                  System.out.println(5/0);
                    boolean f2 = dao.update(b);
                    if(f1 && f2){                       
                        conn.commit();
                        System.out.println("转账成功!");
                    }
                } catch (Exception 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);
    }
}


原文链接:https://blog.csdn.net/mr_tangshuai/article/details/76861720