您的位置:首页 > 其它

JDBC之事务处理

2016-07-23 14:16 253 查看
今天我们讲讲JDBC的事务处理。事务处理在数据库开发中很重要,它的所有操作要么一起成功,要么一起失败。比如A给B银行卡转账100元,那么A卡中减少100元与B卡中多出100元必须一起成功或者一起失败。

事务具有原子性、一致性、独立性、持久性。

今天我们通过银行转账的案例来说明JDBC的事务处理过程。

首先我们建一个db_bank数据库。在其中创建表t_account:

create table `t_account` (
`id` int (11),
`accountname` varchar (60),
`accountBalance` int (11)
);
insert into `t_account` (`id`, `accountname`, `accountBalance`) values('1','张三','1000');
insert into `t_account` (`id`, `accountname`, `accountBalance`) values('2','李四','1000');


下面我们来处理张三向李四转账这个事务:

public class Demo {
private static DbUtil dbUtil = new DbUtil();

// 转出
private static void outCount(Connection con, String accountName, int account) throws Exception {
String sql = "update t_account set accountBalance=accountBalance-? where accountName=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setInt(1, account);
pstmt.setString(2, accountName);
pstmt.executeUpdate();
}

// 转入
private static void inCount(Connection con, String accountName, int account) throws Exception {
String sql = "update t_account set accountBalance=accountBalance+? where accountName=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setInt(1, account);
pstmt.setString(2, accountName);
pstmt.executeUpdate();
}

public static void main(String[] args) {
Connection con = null;
try {
con = dbUtil.getCon();
con.setAutoCommit(false);// 取消自动提交
System.out.println("张三开始向李四转账!");
int account = 500;
outCount(con, "张三", account);
inCount(con, "李四", account);
System.out.println("转账成功!");
} catch (Exception e) {
try {
con.rollback();// 回滚
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
try {
con.commit();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}


通过异常回滚,如果在转账中发生意外,能够会滚到事务发生的初始状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jdbc