数据库事务:是一组逻辑操作单元,使数据从一种状态转变到另一种状态。
事务处理的原则:保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都提交(commit),那么这些修改就会永久的保存下来,要么数据库管理系统将放弃所有的修改,整个事务回滚(rollback)到最初状态。
数据一旦提交,就不可回滚。
会导致数据自动提交的操作:
1、DDL操作一旦执行,都会自动提交。
2、DML默认情况下,一旦执行成功,就会自动提交。(可以通过setAutoCommit(flase);的方式取消DML操作的自动提交)
3、默认在关闭连接时,事务自动提交。如果多个操作,每个操作使用的是自己单独的连接,则无法保证事务,即同一个事务的多个操作必须在同一个连接下。
JDBC程序中为了让多个SQL语句作为一个事务执行:
1、调用Connection对象的setAutoCommit(flase);以取消自动提交事务。
2、在所有的SQL语句都成功执行后,调用commit();方法提交事务。
3、在出现异常时,调用rollback();方法回滚事务。
//从外部获得连接
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
//1、取消数据的自动提交,默认是自动提交
conn.setAutoCommit(false);
String sql1 = "update user_table set balance = balance - 100 where user = ?";
update(conn,sql1,"AA");
String sql2 = "update user_table set balance = balance + 100 where user = ?";
update(conn,sql2,"BB");
System.out.println("转账成功");
//2、提交数据
conn.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
//3、回滚数据
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}finally {
try {
//修改其为自动提交数据
//主要针对使用数据库连接池时使用
conn.setAutoCommit(true);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JDBCUtils.closeResourse(conn, null);
}
注意:若此时Connection没有被关闭,还可能被重复使用,则需要恢复其自动提交的状态,setAutoCommit(false)。尤其是在使用数据库连接池技术时,执行close()方法前,建议恢复为自动提交的状态。