JDBC事务

2019-03-03  java,C,c++语言         公开-普
//JDBC的事务直接将数据库的操作写在同一个连接中,最后通过commit提交事务即可。
conn.setAutoCommit(false);
conn=DBUtilConnection.getConnectionImportData();
String sql="insert into inss(test) values(?)";
try {
	pstmt = conn.prepareStatement(sql);
	pstmt.setString(1, test);
	pstmt.executeUpdate();
	conn.commit();
} catch (Exception e) {
        conn.rollback();
}finally{
        conn.setAutoCommit(true);
	DBUtilConnection.closeAll(null, null, pstmt, conn); }
 
评论列表

参考内容

    2019-03-03    

JDBC事务回滚mysql在cmd下命令效果:https://blog.csdn.net/youcheng_ge/article/details/77683768

事务的提交、回滚与连接之间的关系

    2019-03-03    

commit和rollback只对insert、update、delete(DML数据操纵语句)操作有效。先commit再rollback,则rollback相当于不起作用。若先delete再select再rollback,则rollback会撤回delete操作。其他用户查询看到的是commit之后的表,而你看到的是最新操作的表(比如insert但是没有commit的表)。

  • commit: 就是确定提交的意思,比如你用update更新表中一条记录,而不commit,那么别的账户在查询这个表时就查询不到你update的记录,自己是可以查询到的;而commit后则其他账户就能查询到你update的记录了。 
  • rollback:就是回退的意思,比如你用update更新表中一条记录,这时你查询这个表时,则发现表已经更新(注意别的用户查询这个表会发现表未更新);再rollback后,你再查询表时,发现表还是更新之前的样子。

在JDBC中是通过Connection对象进行事务管理的,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。在mysql中通过select @@autocommit;查看是否自动提交,默认值1表示自动提交。set autocommit=0;设置为手动提交。在Java的mysql驱动中,获取数据库连接后通过conn.setAutoCommit(false);设置手动提交事务。

手动提交事务,在数据库操作之后必须有显式commit提交数据,不然数据不能保存在数据库。不使用rollback方法,在连接关闭时也会自动回滚。


//下面是一些其他内容

事务是一个单一的工作单位。如果事务成功,则在事务中进行的所有数据修改都将被提交并成为数据库的永久部分。如果事务遇到错误,必须取消或回退,则所有数据修改都将被清除这表明事实上交易应该自动回滚。如果客户端到数据库引擎的实例的网络连接中断,则在网络通知中断实例时,所有未完成的连接事务将被回滚。如果连接关闭(网络错误,客户端断开,严重性错误)并且未提交,则事务将回滚。 如果SQL Server终止(关闭,电源故障,意外终止)并且未达到提交,事务将被回滚。 在默认设置下,事务中的语句抛出的非致命错误不会自动导致回滚。 (致命=严重程度为19以上)

当你执行事物启动以后,会导致你insert的area表处于锁定状态,这时候必须有个配对的rollback或commit,这个锁才会释放。在这个锁没有释放以前,对这个表的其他更新就处于等待状态,甚至连查询也处于等待状态。如果你开启了一个事务,迟迟没有提交或回滚,这时候正好其他地方也要操作area表,那么就会导致其他所有地方都处于等待状态,逻辑不对的话,可能会导致循环锁,也就是死锁!!!

不过如果你通过其他的语言的MySQL驱动来操作的话,这些驱动一般都带有自动恢复 AUTOCOMMIT 的功能,在请求处理完成后会自动 ROLLBACK 没有处理的事务。

文章内容的h2标题锚点:
评论列表
参考内容
事务的提交、回滚与连接之间的关系