JDBC是什么?
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。(以上内容来自百度百科)。简单说,JDBC是一个Java API,通过其定义的类和接口你可以使用SQL语句操作支持SQL语句的数据库。
JDBC事务是什么?
关于JDBC事务的概念我也疑惑可好久。先来看看我网上找到的一些解释:①事务(Transaction):是并发控制的单元,是用户定义的一个操作序列。并发控制单元????什么是控制单元,对Java小白这么不友好,差评;②事务是指一组最小逻辑操作单元,里面有多个操作组成。恩有点意思,事务是最小逻辑操作单元,这个单元里有好多操作。③事务是一步或多步组成操作序列组成的逻辑执行单元。恩有点意思了。事务是由很多部操作或者一步操作组成的一个操作组合。
好根据上边的知识,我用我自己的理解解释一下:你想让数据库执行一个任务,而这个任务至少要N步(N>=1)操作才能完成,这N步操作组合在一起就叫做事务。
举个例子:你现在是公司数据库管理者,公司有位员工离职啦,你现在需要在公司数据库里删除这个员工的信息,这就是你需要数据库执行的任务。而删除这位员工的信息你需要删除他的基本资料,还有他在公司的信箱和其他信息。而你删除这每一种信息所做的操作组合起来就是事务。再来一个。某一个人A从他的账户里转出一笔钱给B,此时数据库的任务就是完成这笔转账操作。完成这个任务需要把A账户上的钱数目减少,给B账户数目增加,这写操作组合起来就是一个事务。
事务的四大属性
这时候有人会问我单个单个操作去执行,也可以完成这任务啊,为啥非得组合起来,取名叫事务。恩,这个问题问的好。这个时候就要引出事务的四个属性。(那你以为呢,人家还有属性)。
原子性:一组事务中的操作要么全部执行,要么一个都不执行。银行转账例子中,要么A账户减少和B账户增加都执行,要么你都不要执行。你要是不小心只执行了一个,那就很成问题啊小朋友!
一致性:事务完成后,必须所有的数据都保持一致。在银行转账例子中,参与转账的两个账户的余额总和在转账前后是一致的,你想想,是不是这个道理。
隔离性:事务独立运行,而且是100%独立,两个并发事务不可能同时对同一个数据进行操作。还是以银行转账为例子,这回在增加一个C,A和C同时给B转账,A转100,C转200如果同时操作,B的账户上突然一下子多了300元,那B怎么知道这300是谁转的,谁转了多少,这更麻烦了!
持久性:事务完成后,对系统的影响是持久的。这个很好理解了,A给B转了钱,那么这笔转账操作永远有效。如果今天有效,明天没效,岂不是很难过。
所以通过事务,sql server 能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。这就是为什么要使用事务的原因。
事务机制的代码实现
JBDC为开发者提供了专门的使用事务的API。默认情况下,JDBC使用自动提交事务的方式,也就是说,一旦SQL语句完成,就提交事务。但是多数情况下,开发者需要控制事务的过程,如果发生了某个异常或者参数出现问题后,能够回滚事务。代码如下:
Connection conn = DriverManager.getConnection("连接URL","用户名","密码");
try {
conn.setAutoCommit(false); //关闭自动提交事务
stme = conn.createStatement(); //创建会话
stmt.excuteUpdate("执行sql语句"); //执行SQL增删改查命令
conn.commit(); //提交事务
} catch(Exception e) {
e.printStackTrace();
conn.rollback(); //回滚事务
} fianlly {
if(stmt != null) //判断会话是否为空
stmt.close(); //关闭会话
if(conn != null) //判断连接是否为空
conn.close(); //关闭连接
}
一般来说,JDBC中使用事务服务大致有一下几个步骤:
(1)关闭自动提交,,设置连接的自动提交事务属性为false;
(2)捕获(try catch)执行代码。如果执行过程顺利,提交事务,一旦发生异常,回滚(rollback)事务;
(3)关闭连接。