Connection.setAutoCommit()的使用思考

来源:互联网 发布:淘宝网风骑士俱乐部 编辑:程序博客网 时间:2024/06/16 11:27

Connection.setAutoCommit()总的来说是为了保护数据库的一致性的,一般用在事务处理中。首先聊聊事务处理的必要性:

例子:
在银行中A向B转账5000元
那么就有两个操作:
①:A的账户减少5000元
②:B的账户增加5000元
假如在执行②操作时,系统出现故障,如果不采用事件处理,就会发生A账户减少5000元,而B账户并没有增加的问题,也就是产生脏数据,那么就必须采取事件处理。

下面的程序用来演示,逐步说明事务处理的原理以及Connection.setAutoCommit()的用法:

程序一:未采用事务处理

public class Test{public static void main(String[] args) {    Connection con=getConnection();    try {        //执行更新操作,A账户减少5000元        update1(con);        //执行更新操作,A账户增加5000元        update2(con);    } catch (Exception e) {        e.printStackTrace();    }    finally {        if(con!=null){            try{            con.close();            }catch(Exception e){            }        }    }}

如果在执行update2()时系统故障,那么update1()就会写入数据库,但是更新2没有执行,这就会产生错误。再看下一个程序:

程序二:采用事务处理

public class Test{public static void main(String[] args) {    Connection con=getConnection();    try {        //设置为手动提交        con.setAutoCommit(false);        update1(con);        update2(con);        //手动提交        con.commit();    } catch (Exception e) {        try {        //如果出错回滚所有数据            con.rollback();        } catch (Exception e2) {                }    }    finally {        if(con!=null){            try{            con.close();            }catch(Exception e){            }        }    }}

可以看到我们将Connection.setAutoCommit(false)加入到代码中,意思就是由用户统一提交更改,而不是跟以前一样,每执行一个操作就写入数据库中。
假如在执行更新操作时,出现错误,那么程序就不会走到con.commit()中去,数据就不会提交,然后会通过con.rollback()将事务回滚,将数据恢复到之前的样子。
这样就保证了数据的一致性。

注意事项:
如果将Connection.setAutoCommit()设置为false,那么一定要有con.commit(),因为如果程序正确执行,但是却没有提交也没有回滚,那么相应的表就会被锁起来,而con没有机会释放连接。所以这点是我们要注意的。

原创粉丝点击