最经典的解释事务处理的例子应该是关于银行转账的问题:
张三给李四转钱,张三把钱转给李四的同时,李四的账号上面应该增加对应的金额,但是如果在这期间,突然发生意外情况,例如断电死机等,使得张三的钱被扣掉了,但是对应的李四账户上面却没有增加对应的金额。这样就是不安全的转账,而且是谁也不愿意的。而我们利用事务处理就可以避免这种情况。事务处理的好处就是,所执行的语句要么同时处理,要么同时不处理。
事务处理是一种机制,用来管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果。利用事务处理,可以保证一组操作不会中途停止,他们或者作为整体执行,或者完全不执行(除非明确指示)。如果没有错误发生,整组语句提交到数据库表,如果发生错误,则进行回退,以恢复数据库到某个已知且安全的状态。
java运用事务处理时,首先要修改默认的自动提交,我们将提交方式更改为手动的提交,这样的话,我们才能将一批要处理的语句放在一个事务里面进行同时处理或者不处理。然后再进行手动提交,在事务处理完成之后,一定要记得恢复现场,将提交设置为默认的自动提交。这样的话,当catch到任何的sqlexception的情况下,进行事务回滚。。然后回退到一个安全的状态。
public class JdbcTransaction {
public static void main(String[] args){
Connection conn =null;
Statement stmt = null;
try{
Class.forName("com.mysql.jdbc.Driver"); //建立驱动
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/studemo","root","root");//建立连接
stmt = conn.createStatement();//创建语句
conn.setAutoCommit(false); // 设置不自动提交
stmt = conn.createStatement();
stmt.addBatch("insert into stu values (25,'zhangsan','1234')");
stmt.addBatch("insert into stu values (4,'zhangsan','1234')");
stmt.addBatch("insert into stu values (27,'zhangsan','1234')"); // sql语句为任意的DML操作语言
stmt.executeBatch();
conn.commit(); // 进行事务手动提交
conn.setAutoCommit(true); // 还原现场
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
// e.printStackTrace(); 屏蔽这句话,不会控制台提示报错,但是事务在出错的时候会进行回滚
try{
if(conn!=null){
conn.rollback(); // 当catch到任何的SQLException,进行事务回滚
conn.setAutoCommit(true);
// 可能会因为某个sql语句出错而无法执行上面的还原现场代码,所以再次设置
}
}catch (SQLException e1) {
// TODO: handle exception
e1.printStackTrace();
}
}finally{
try{
if(stmt!=null){stmt.close();stmt=null;}
if(conn!=null){conn.close();conn=null;}
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
解释:上面的处理由于添加了事务,在执行插入第二句的时候进行了错误,但是由于添加了事务,所以回滚到以前,把第一句正常的也给回滚到以前而没有插入到数据库。这就是事务处理。如果在没有事务处理的情况下,会将第一句插入到数据库。
关于事务处理查看http://blog.csdn.net/sinat_28978689/article/details/56292044