Connection.setAutoCommit()的使用思考
2017-07-07 15:32
351 查看
Connection.setAutoCommit()总的来说是为了保护数据库的一致性的,一般用在事务处理中。首先聊聊事务处理的必要性:
例子:
在银行中A向B转账5000元
那么就有两个操作:
①:A的账户减少5000元
②:B的账户增加5000元
假如在执行②操作时,系统出现故障,如果不采用事件处理,就会发生A账户减少5000元,而B账户并没有增加的问题,也就是产生脏数据,那么就必须采取事件处理。
下面的程序用来演示,逐步说明事务处理的原理以及Connection.setAutoCommit()的用法:
程序一:未采用事务处理
如果在执行update2()时系统故障,那么update1()就会写入数据库,但是更新2没有执行,这就会产生错误。再看下一个程序:
程序二:采用事务处理
可以看到我们将Connection.setAutoCommit(false)加入到代码中,意思就是由用户统一提交更改,而不是跟以前一样,每执行一个操作就写入数据库中。
假如在执行更新操作时,出现错误,那么程序就不会走到con.commit()中去,数据就不会提交,然后会通过con.rollback()将事务回滚,将数据恢复到之前的样子。
这样就保证了数据的一致性。
注意事项:
如果将Connection.setAutoCommit()设置为false,那么一定要有con.commit(),因为如果程序正确执行,但是却没有提交也没有回滚,那么相应的表就会被锁起来,而con没有机会释放连接。所以这点是我们要注意的。
例子:
在银行中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没有机会释放连接。所以这点是我们要注意的。
相关文章推荐
- Java Connection.setAutoCommit使用的注意事项
- Connection.setAutoCommit使用的注意事项
- 由于没有正确使用Connection.setAutoCommit(false)而导致SQL语句没有被提交
- Connection.setAutoCommit使用的注意事项
- Connection.setAutoCommit使用的注意事项
- Connection.setAutoCommit使用的注意事项
- Connection.setAutoCommit使用的注意事项
- Connection.setAutoCommit使用的注意事项
- Connection.setAutoCommit使用的注意事项
- Connection.setAutoCommit使用的注意事项(转)
- Connection.setAutoCommit使用的注意事项
- Connection.setAutoCommit使用的注意事项
- Connection.setAutoCommit使用的注意事项
- Connection.setAutoCommit使用的注意事项
- Connection.setAutoCommit(boolean b)自动提交事务
- 【数据库】使用Collection.setAutoCommit(false)的注意事项
- connection.setAutoCommit注意事项
- Connection的setAutoCommit()方法
- 误用Connection.setAutoCommit导致的数据库死锁问题
- 使用hibernate中connection.release_mode,connection.autocommit和transaction.auto_close_session用法及需要注意的问题