/*
1.什么叫数据库事务?
事务:一组逻辑操作单元,使数据从一种状态变换到另外一种状态。
>一组逻辑操作单元:一个或多个DML操作。
2.事务处理的原则:
保证所有事务都作为一个工作单元来执行,即出现了故障,都不能改变这种执行方式。
当一个事务中执行多个操作时,要么所有事务都被提交(commit)那么这些修改将永久保存下来、
要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初的状态
3.数据一旦提交则无法回滚
4.哪些操作会导致数据的自动提交?
>DDL操作一旦提交则自动提交
>set autcommit=false的方法对DDL无效
>DML默认情况下,一旦执行,则自动提交
>我们可以通过set autcommit=false的方式取消DML操作的自动提交
>默认在关闭连接时,会自动的提交数据
*/
//*****************************考虑数据库事务的转账操作*******************************
@Test
public void testUpdateWithtx() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
//取消数据的自动提交功能
conn.setAutoCommit(false);
String sql1 = "update user_table set balance = balance-100 where user=?";
update(conn,sql1,"AA");
//模拟网络异常
// System.out.println(10/0);
String sql2 = "update user_table set balance = balance+100 where user=?";
update(conn,sql2,"BB");
System.out.println("转账成功");
//提交数据
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} finally {
try {
conn.setAutoCommit(true);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
JDBCUtils.closeResource(conn,null);
}
}
//通用的增删改操作(考虑上事务的改进版本)
public int update(Connection conn,String sql ,Object...args){//sql中占位符的个数应该和可变形参的长度相同
PreparedStatement ps = null;
try {
//预编译sql语句 返回到PrepareStatement实例
ps = conn.prepareStatement(sql);
//填充 占位符
for (int i = 0; i < args.length ; i++) {
ps.setObject(i + 1 ,args[i]);
}
//4.执行
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(null,ps);
}
return 0;
}
}