准备一张表,只是简单的一张表,用于模拟两个用户的转账,用Java实现事务的完整性处理
actno | banlance |
---|---|
111 | 40000 |
222 | 20000 |
361 | 1000 |
369 | 9000 |
假设账户 361向账户369 转账1000,如果转账成功,则用户361余额为0,用户369余额为10000
import java.util.*;
import java.sql.*;
public class 用户转账 {
public static void main(String[] args) {
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String user = bundle.getString("user");
String password = bundle.getString("password");
Connection conn = null;
PreparedStatement ps = null;
try {
//注册驱动
Class.forName(driver);
//获取连接
conn=DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false);
//获取预编译的数据库操作对象
// String sql="update 用户表 set 真实姓名=?, id=? where loginName=? ";
// String sql="insert into 用户表 values(?,?,?,?)";
String sql1="update t_act set banlance=banlance-1000 where actno=361";
ps=conn.prepareStatement(sql1);
int count=ps.executeUpdate();
String sql2="update t_act set banlance=banlance+1000 where actno=369";
ps=conn.prepareStatement(sql2);
count+=ps.executeUpdate();
/* String s=null;
s.toString();
*/
conn.commit();
System.out.println(count==2?"转账成功":"转账失败");
} catch (Exception e){
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
// e.printStackTrace();
System.out.println("转账失败");
}
finally{
if (ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
执行代码,
|actno|banlance|
|111 |40000 |
|222 |20000 |
|361 |0 |
|369 |10000 |
如果将注释中的空指针放开,则出现空指针异常,事务进行回滚,执行代码,
转账失败。