JDBC-事务

事务简介:

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

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

3390fa9a3dc3aaa27a770791e5df3a60.png


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

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

  使用了事务处理示意图:

fd4be3938a5f19b6f4e1d0c9c198c4bb.png


86ddd42d6ccbf27703445a829e621d96.png


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

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

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

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

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

注意:

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

 



JDBC事务操作:

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

自动事务(默认):

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

 

手动事务:

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

 

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

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

  自动事务代码示例:

feac4f785a5acf018d45b14297fddbea.png


运行结果:

cd8000d84fd874c436fb764cd1c631ab.png


数据库:

928d38af8d85b6d7f4a6beca68a5cb25.png


SQL语句错误示例:

5c58753a6e9a370c699281c818ce9799.png


运行结果:

0a3ca0614f148a09f1106f46e886cf6d.png


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

7d505490f6da07b15f36e83b0981d8c1.png



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

653ec90f2f0b00df99c25b4b6b43b524.png


运行结果:

2e8e74bbad288219cdff0747b9774576.png


数据库:

43491bc70c4a00b82894da854c83cf2e.png


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



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

0e947fb32d9f3f3e8bace0579169e212.png


运行结果:

edaedb49a5db41b97b63dfe381e15b68.png

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

 

数据库:

a3b272854efd288c67b48d53e6f1ccee.png



手动事务不调用commitrollback方法代码示例:

1fffad95e5d6ca01276555a94e891c1a.png


运行结果:

0923201175bf7584994e2bddaddbbd86.png


数据库:

4fde2d3053db538911d5b8cc8167a3cb.png

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

 


SQL语句错误示例:

55a11db35c10740a50cc2d3020e08941.png


运行结果:

6b3a5e681aff235d636278c50816197e.png


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

26d552b822579c1ae3d5ebfdad49e7da.png


如果不开启事务处理:

3776f032b0338f6b9b9fd58306b70975.png


运行结果,同样会报错:

d33413ac6281c0ab53da21b5ffa05b84.png



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

90d13b7ccd0460e39c62db4c24c17026.png



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

7613095bc7610ce887af85e3fba1aeeb.png


运行结果:

e288a1caa07060b986e69481f0e3e13d.png


数据库:

c002fcb119fce5328233a75758482837.png




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

  事务思维导图:

c12bd839ab9f3e98263ad7b709846e0c.png



本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1977009,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值