您的位置:首页 > 数据库

Connection.setAutoCommit()的使用思考

2017-07-07 15:32 351 查看
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没有机会释放连接。所以这点是我们要注意的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 事务 jdbc