
银行转账业务是一个典型的事务,我们先介绍基本概念,这样后面的代码看起来就比较容易理解了。
一、事务处理
“事务处理”这个名字的概念,相信大多数朋友都有所了解。我们看一下维基百科中关于“事务处理”的定义:
“在计算机科学中,事务是无法被分割的操作,事务处理就是被分割为个体的信息处理。事务必须作为一个完整的单元成功或失败,不可能存在部分完成的事务。”
看着是不是有点绕?
好,我们换个视角看“事务处理”,从数据库视角。
在数据库操作中,事务是由一条或者多条SQL语句组成的一个工作单元。只有当事中的所有操作都正常完成,整个事务才被提交到数据库,如果意向操作没有完成,则整个事务被撤销。
例如zhangsan给lisi转200元钱,对应的SQL是;
UPDATE ACCOUNT set MONEY=MONEY-200 WHERE NAME='zhangsan';
UPDATE ACCOUNT set MONEY=MONEY+200 WHERE NAME='lisi';
转钱这件事,就是一个事务处理。所以,事务是以数据为核心的,而数据是存在关系型数据库上的。因此,应用如何操作数据库就成为事务处理中的关键。
Java应用操作数据库的模块是JDBC。
二、JDBC
JBDC的全称为:Java Database Connectivity,是一套用于执行SQL语句的Java API。应用程序可以通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库的查询、更新、删除工作。
我们先看一下JDBC API的内容。
在下面的三色框中,中间部分是JDBC常用的API。
第一部分是DataSource接口的实现;
第三名部分是DBUtils工具库;
JDBC的实现细节如下图所示,包含三大部分:
(1)JDBC驱动管理器:负责注册特定的JDBC驱动器,通过java.sql.DeviceManager类实现。
(2)Java驱动器API;其中最主要的接口是:java.sql.Driver接口。
(3)JDBC驱动器:一种数据库驱动,由数据库厂商创建。JDBC启动器实现了JDBC驱动器API,负责与特定的数据库链接,以及处理通信细节。
一个完整的JDBC分为六大步骤:通过DriverManager加载并注册DB驱动
通过DeiverManager获取数据库连接(DB connection)
通过Connection对象获取Statement对象。
使用Statement执行SQL语句,生成结果集ResultSet。
操作结果集,取出结果。
释放数据库资源
需要注意的是:由于Driver类的源码中,已经在静态代码块中完成了数据库驱动的注册,所有为了避免数据库驱动被重复注册,主要在程序中加载驱动类即可。
下面我们查看一个完成的JDBC示例。下图中的标号,就对应上文的6个步骤。我们看到第六步释放了Statement和Connection资源。


三、JDBC批处理
在实际开发中,经常需要向数据库发送多条SQL语句。这时如果逐条执行这些SQL语句,效率会很低。为此,JDBC提供了批处理机制,可以同时执行多条SQL语句。Statement和PreparedStatement都实现了批处理。
PreparedStatement是Statement的一个子类。PreparedStatement对象可以对SQL语句进行预编译。当相同的SQL语句再次执行时,数据库只需使用缓冲区的数据,而不需要对SQL语句再次编译,从而有效提高了数据的访问效率。
我们查看Statement加载和执行批处理的代码,如下图红框所示:
我们再看通过PreparedStatement加载和执行批处理的代码:
很明显,

本文详细分析了银行转账业务中的事务处理,介绍了事务处理的基本概念和数据库视角的理解。通过Java JDBC展示了如何操作数据库,包括JDBC的批处理、事务处理,并对比了集中式事务与分布式事务的本质差异。此外,还探讨了数据库连接池技术,如DBCP和C3P0的使用,以及Apache DBUtils工具类在事务处理中的作用。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



