前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDBC-事务

JDBC-事务

作者头像
端碗吹水
发布2020-09-23 10:41:03
4680
发布2020-09-23 10:41:03
举报
文章被收录于专栏:程序猿的大杂烩

事务简介:

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

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

3390fa9a3dc3aaa27a770791e5df3a60.png
3390fa9a3dc3aaa27a770791e5df3a60.png

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

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

  使用了事务处理示意图:

fd4be3938a5f19b6f4e1d0c9c198c4bb.png
fd4be3938a5f19b6f4e1d0c9c198c4bb.png
86ddd42d6ccbf27703445a829e621d96.png
86ddd42d6ccbf27703445a829e621d96.png

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

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

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

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

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

注意:

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

JDBC事务操作:

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

自动事务(默认):

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

手动事务:

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

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

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

  自动事务代码示例:

feac4f785a5acf018d45b14297fddbea.png
feac4f785a5acf018d45b14297fddbea.png

运行结果:

cd8000d84fd874c436fb764cd1c631ab.png
cd8000d84fd874c436fb764cd1c631ab.png

数据库:

928d38af8d85b6d7f4a6beca68a5cb25.png
928d38af8d85b6d7f4a6beca68a5cb25.png

SQL语句错误示例:

5c58753a6e9a370c699281c818ce9799.png
5c58753a6e9a370c699281c818ce9799.png

运行结果:

0a3ca0614f148a09f1106f46e886cf6d.png
0a3ca0614f148a09f1106f46e886cf6d.png

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

7d505490f6da07b15f36e83b0981d8c1.png
7d505490f6da07b15f36e83b0981d8c1.png

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

653ec90f2f0b00df99c25b4b6b43b524.png
653ec90f2f0b00df99c25b4b6b43b524.png

运行结果:

2e8e74bbad288219cdff0747b9774576.png
2e8e74bbad288219cdff0747b9774576.png

数据库:

43491bc70c4a00b82894da854c83cf2e.png
43491bc70c4a00b82894da854c83cf2e.png

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

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

0e947fb32d9f3f3e8bace0579169e212.png
0e947fb32d9f3f3e8bace0579169e212.png

运行结果:

edaedb49a5db41b97b63dfe381e15b68.png
edaedb49a5db41b97b63dfe381e15b68.png

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

数据库:

a3b272854efd288c67b48d53e6f1ccee.png
a3b272854efd288c67b48d53e6f1ccee.png

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

1fffad95e5d6ca01276555a94e891c1a.png
1fffad95e5d6ca01276555a94e891c1a.png

运行结果:

0923201175bf7584994e2bddaddbbd86.png
0923201175bf7584994e2bddaddbbd86.png

数据库:

4fde2d3053db538911d5b8cc8167a3cb.png
4fde2d3053db538911d5b8cc8167a3cb.png

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

SQL语句错误示例:

55a11db35c10740a50cc2d3020e08941.png
55a11db35c10740a50cc2d3020e08941.png

运行结果:

6b3a5e681aff235d636278c50816197e.png
6b3a5e681aff235d636278c50816197e.png

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

26d552b822579c1ae3d5ebfdad49e7da.png
26d552b822579c1ae3d5ebfdad49e7da.png

如果不开启事务处理:

3776f032b0338f6b9b9fd58306b70975.png
3776f032b0338f6b9b9fd58306b70975.png

运行结果,同样会报错:

d33413ac6281c0ab53da21b5ffa05b84.png
d33413ac6281c0ab53da21b5ffa05b84.png

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

90d13b7ccd0460e39c62db4c24c17026.png
90d13b7ccd0460e39c62db4c24c17026.png

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

7613095bc7610ce887af85e3fba1aeeb.png
7613095bc7610ce887af85e3fba1aeeb.png

运行结果:

e288a1caa07060b986e69481f0e3e13d.png
e288a1caa07060b986e69481f0e3e13d.png

数据库:

c002fcb119fce5328233a75758482837.png
c002fcb119fce5328233a75758482837.png

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

  事务思维导图:

c12bd839ab9f3e98263ad7b709846e0c.png
c12bd839ab9f3e98263ad7b709846e0c.png
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/10/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档