事务简介:
事务处理用于维护数据库的完整性,它保证批量的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方法结束后才能再次开启,代码示例:
运行结果:
数据库:
从以上的小实验中,可以总结出,事务处理能够帮我们保证数据的完整性,不会残留数据在数据库中。事务还可以分为自动事务和手动事务,在不开启手动事务的情况下等于使用自动事务,而且事务还能开启多次,新的事务要在上一个事务结束后才能再次开启。
事务思维导图: