一、建立余额表(bal_tab,余额必须大于0)、交易表(bus_tab)
二、建立转账事务类BankBusiness.java
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import cn.yanchengdai.util.DataSourceForPool;
/**
* 银行转账事务处理示例
* @author Administrator
*
*/
public class BankBusiness {
/**
* 处理转账的方法
* @param transferMoney
*/
public void testTrans(int transferMoney) {
/*从数据库连接池中获取数据库连接*/
Connection conn = DataSourceForPool.getConnection();
/*交易表中插入两条数据*/
String sql1 = "insert into bus_tab values(?,?,?,?,?)";
String sql2 = "insert into bus_tab values(?,?,?,?,?)";
/*余额表中更新余额*/
String sql3 = "update bal_tab set balance=(balance-?) where id = ?";
String sql4 = "update bal_tab set balance=(balance+?) where id = ?";
/*声明PreparedStatement变量*/
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
PreparedStatement ps3 = null;
PreparedStatement ps4 = null;
try {
/*设置自动关闭connetion自动提交*/
conn.setAutoCommit(false);
ps1 = conn.prepareStatement(sql1);
ps1.setInt(1, 1);
ps1.setInt(2, transferMoney);
ps1.setString(3, "转出");
ps1.setDate(4, new java.sql.Date(System.currentTimeMillis()));
ps1.setInt(5, 100);
ps2 = conn.prepareStatement(sql2);
ps2.setInt(1, 2);
ps2.setInt(2, transferMoney);
ps2.setString(3, "转入");
ps2.setDate(4, new java.sql.Date(System.currentTimeMillis()));
ps2.setInt(5, 200);
ps3 = conn.prepareStatement(sql3);
ps3.setInt(1, transferMoney);
ps3.setInt(2, 100);
ps4 = conn.prepareStatement(sql4);
ps4.setInt(1, transferMoney);
ps4.setInt(2, 200);
ps1.executeUpdate();
ps2.executeUpdate();
ps3.executeUpdate();
ps4.executeUpdate();
/*以上顺利执行,则提交事务*/
conn.commit();
System.out.println("转账成功");
} catch (SQLException e) {
System.out.println("转账失败,事务回滚!");
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
try {
ps4.close();
ps3.close();
ps2.close();
ps1.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
三、测试类TestTransaction.java
import java.util.Scanner;
import cn.yanchengdai.dao.BankBusiness;
public class TestTransaction {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入转账金额:");
int transfer = in.nextInt();
System.out.println("银行正在转账中,请稍后。。。");
new BankBusiness().testTrans(transfer);
}
}
四、测试结果
当转账20000时,余额=0,违反了检查约束,事务回滚,两张表中数据不变:
当转账9000时,显示转账成功。
转账记录:
余额表: