1.JDBC事务自动提交
JDVC默认的事务行为是只要执行任意一条DML语句,则自动提交一次
但在实际业务中,需要N条DML语句共同联合才能完成,必须保证这些DML语句在同一个事务中同时成功或失败
JDBC自动提交示例
String sql = "update dept set dname = ? where deptno = ?";
ps = conn.prepareStatement(sql);
ps.setString(1,"X部门");
ps.setInt(2,30);
int count = ps.executeUpdate();
System.out.println(count);//1
String sql = "update dept set dname = ? where deptno = ?";
ps = conn.prepareStatement(sql);
ps.setString(1,"Y部门");
ps.setInt(2,30);
count = ps.executeUpdate();
System.out.println(count);//1
2.JDBC事务手动提交
重要三行代码
conn.setAutoCommit(false);
conn.commit();
conn.rollback();
两个账户转款
public class JDBCTest10 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://loaclhoat:3306/bjpowernode", "root", "333");
conn.setAutoCommit(false);//开启事务
String sql = "update t_act set balance = ? where actno = ?";
ps = conn.prepareStatement(sql);
ps.setDouble(1, 10000);
ps.setInt(2, 111);
int count = ps.executeUpdate();
ps.setDouble(1, 10000);
ps.setInt(2, 222);
count += ps.executeUpdate();
System.out.println(count == 2 ? "转账成功" : "转账失败");
//程序能够走到这里说明以上程序没有异常,事务结束,手动提交数据
conn.commit();
} catch (Exception e) {
//出异常,回滚事务
if (conn != null) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
} finally {
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
传送门
上一章:JDBC 第三章 SQL注入
下一章:JDBC 第五章 JDBC工具类的封装