今天是学习计划的第二天,感觉自己的学习热情还是很高涨的啊,那我们就趁热打铁,开始今天的学习。

今天的学习内容是JDBC的事务控制管理。
首先是概念性的内容
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。这是我对于事务的理解。
举个例子: A转账给B,对应如下的两条sql语句
update from account set money = money - 100 where name = 'A'
update from account set money = money + 100 where name = 'B'
在现实生活中,这两条sql语句要么就应该同时成功,要么就应该同时失败,否则用户的账户就会产生问题。
在MySQL数据库中,默认情况下,一条sql语句就是一个单独的事务,事务是自动提交的
在Oracle数据库中,默认情况下,事务不是自动提交的,所有sql语句都处于一个事务中,需要手动进行事务提交。
数据库事务命令

  • start transaction 开启事务
  • rollback 回滚事务
  • commit 提交事务

我们来操作一个案例感受一下。
首先设置账户表(account)  在表中插入一些初始数据

create table account(     id int primary key not null auto_increment,     name varchar(40),     money double );  insert into account values(1,'aaa',1000); insert into account values(2,'bbb',1000); insert into account values(3,'ccc',1000);

然后打开我们的控制台进入数据库,输入 start transaction;这时候我们去修改数据,输入update account set money = money - 100 where name ='aaa';,然后输入查询语句select * from account;查询
在这里插入图片描述
此时说明更新语句成功执行了,但是请注意,我们在更新数据之前使用start transaction语句开启了一个事务,所以如果我们不手动提交,事务是不会被提交的,我们可以打开另一个控制台进入数据库,并查询该表
在这里插入图片描述
会发现,名字为aaa账户的余额并没有被改变,这就是事务的状态。
其实,在事务管理中执行sql语句,都会使用数据库内的临时表保存,在没有进行事务提交或者回滚的前提下,其它用户是无法看到操作结果的。
回到第二个用户的操作中,当我输入commit;提交事务时,我们再次查询表数据
在这里插入图片描述
这个时候第二个用户才能查询到第一个用户更新的数据。
我们继续在第一个用户的数据库中操作,重新开启一个事务,然后输入update account set money = money + 100 where name ='bbb';,查询表数据
在这里插入图片描述bbb账户的金额多了100,此时,我们可以使用回滚操作,通俗地讲,就是撤销上一次的sql语句,输入rollback;然后重新查询表数据
在这里插入图片描述
会发现,bbb账户的金额又变为了1000,说明回滚操作生效了。
需要注意的是,sql语言中只有DML才能被事务管理,那什么是DML,DML就是数据操纵语言,是SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除,所以只有这三个关键字才能被事务管理,其它语句是不能被事务管理的。
这样事务的基本操作都在控制台进行了对应的练习,接下来我们了解一下JDBC在项目中是如何控制事务的。
在MyEclipse中新建一个名为demo的的web项目,然后导入数据库的驱动,这个东西我就不提供了,在官网或者其它地方都能够下载。为了方便接下来的数据库操作,我先写了一个简易的JDBC工具类,新建JDBCUtils.java文件

/**  * JDBC 工具类,抽取公共方法  *   * @author seawind  *   */ public class JDBCUtils {     private static final String DRIVERCLASS;     private static final String URL;     private static final String USER;     private static final String PWD;      static {         ResourceBundle bundle = ResourceBundle.getBundle("dbconfig");         DRIVERCLASS = bundle.getString("DRIVERCLASS");         URL = bundle.getString("URL");         USER = bundle.getString("USER");         PWD = bundle.getString("PWD");     }      // 建立连接     public static Connection getConnection() throws Exception {         loadDriver();         return DriverManager.getConnection(URL, USER, PWD);     }      // 装载驱动     private static void loadDriver() throws ClassNotFoundException {         Class.forName(DRIVERCLASS);     }      // 释放资源     public static void release(ResultSet rs, Statement stmt, Connection conn) {         if (rs != null) {             try {                 rs.close();             } catch (SQLException e) {                 e.printStackTrace();             }             rs =