JDBC-事务

2020-09-23 10:41:03 浏览数 (1)

事务简介:

事务处理用于维护数据库的完整性,它保证批量的SQL语句要么完全执,要么完全不执行。因为当我们要执行多条SQL语句时,如果只有前面几条语句执行成功,但是后面的SQL语却执行失败的话,那么数据库中就会残留执行成功的数据,而执行失败的语句则自然不会有数据残留,但是这却会导致数据不匹配、不完整。

没有使用事务处理示意图:

没有使用事务处理的情况下,某条SQL语句执行失败就会导致数据的不完整性,如果使用查询语句倒是无所谓,使用更新语句、插入语句、删除语句等等对数据库数据进行了修改的语句,一旦语句执行失败就会发生这种情况或者类似的情况,而且在数据多的情况下或许会连残留数据在哪里都不知道,日积月累下来残留数据的数量增加就会影响数据库的性能。

所以解决这种问题就需要用到事务处理了,事务处理是一种机制,用来管理必须批量执行的SQL语句,以保证数据库中不会存在不完整或残留的数据。利用事务处理可以保证一组SQL语句不会一半执行成功,一半执行失败,可以让这组语句整体执行,或者指定完全不执行,如果过程发生错误,则进行回滚(撤销)操作,以恢复到数据库到某个已知且安全的状态,没有错误发生,就会将这组语句提交到表格里,也就是会将操作结果写入到表格里。

  使用了事务处理示意图:

所以在事务处理里有提交(Commit)和回滚(Rollback)的操作。

回滚:在一组SQL语句执行的过程中,发生了任何问题,都可以取消所有的的操作,回退到语句执行前或者设置的保留点的位置。

提交:如果你觉得所有的执行执行都是正确的,就可以调用提交,将数据永久写入到数据库中。

提示:事务处理这个机制是数据库的机制,JDBC只是可以控制事务的提交和回滚。

事务什么情况下结束?当事务提交或回滚时即结束事务。

注意:

并非所有的数据库引擎都支持明确的事务处理机制,MyISAM和InnoDB是两种最常使用的引擎,前者不支持事务处理,而后者支持。所以需要用到事务处理时,要使用正确的数据库引擎。

JDBC事务操作:

事务分为自动事务和手动事务,这两者有一定的区别需要记住。

自动事务(默认):

在自动事务的情况下,只要SQL语句是正确的,执行的过程中没有发生异常、错误,就会提交到是数据库中,一般情况下没有指定的话就是默认为自动事务,实际上没有设定过的数据库就是自动事务,也就是说我们平时的数据库操作都是自动事务,所以自动事务会出现数据残留现象。

手动事务:

在手动事务的情况下,需要自己调用提交或回滚来接结束事务,不然事务处理不会结束,手动事务有自定义的好处,而且能够自己判断语句的操作结果是否是自己想要的,如果不是自己想要的就可以进行回滚,是自己想要的操作结果才提交,自动事务则只要语句没出错都会进行提交。在大部分情况下,使用手动事务要多一些,因为使用自动事务的话语句没出错就自动把操作结果提交了,当SQL语句里的值写错了,或者操作结果不是正确的,就没办法进行回滚了,这些情况下SQL语句不会报错。

进入正题:通过JDBC来控制事务处理:

在JDBC里使用Connection对象,调用setAutoCommit方法来开启事务,这个方法会要求传递一个参数,传递true则表示使用自动事务处理,传递false则是使用手动事务处理,如果你开启了手动提交事务,但是你没有调用提交或者回滚的话,默认是回滚操作。

  自动事务代码示例:

运行结果:

数据库:

SQL语句错误示例:

运行结果:

数据库,因为第一条SQL语句是正确的,所以残留了数据在数据库中:

手动事务提交操作代码示例:

运行结果:

数据库:

使用手动事务时要注意一点,调用commit();提交方法,要写在executeUpdate方法后面。

手动事务回滚操作代码示例:

运行结果:

回滚操作也是有返回值的,只是数据没有写入到表格中。

数据库:

手动事务不调用commit、rollback方法代码示例:

运行结果:

数据库:

从结果可以证明,不调用commit、rollback方法值默认回滚的。

SQL语句错误示例:

运行结果:

数据库,第一句正确的SQL没有写入到表格中:

如果不开启事务处理:

运行结果,同样会报错:

数据库,但是第一句SQL却写入到表格中了,这和自动事务是一样的,因为不开启手动事务就等于是使用了自动事务:

事务还可以开启多次,但是要在上一个事务调用了ommit、rollback方法结束后才能再次开启,代码示例:

运行结果:

数据库:

从以上的小实验中,可以总结出,事务处理能够帮我们保证数据的完整性,不会残留数据在数据库中。事务还可以分为自动事务和手动事务,在不开启手动事务的情况下等于使用自动事务,而且事务还能开启多次,新的事务要在上一个事务结束后才能再次开启。

  事务思维导图:

0 人点赞