Java Database Connectivity——7. JDBC 事务管理

一、什么是事务

直接百科

Java Database Connectivity——7. JDBC 事务管理

可以看一下,前面的没有啥用,自己了解,主要看后面的一句话。

事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

这也就是说,事务,有一个开始,还有一个结束。然后再往下看

Java Database Connectivity——7. JDBC 事务管理

这个百科也举了一个例子:在关系型数据库中,一个事务可以是一条 SQL,或者一组 SQL,再或者整个程序。

二、事务的特性

Java Database Connectivity——7. JDBC 事务管理

这个背也要背会,这以后写程序这些东西是一定要知道的!!!

事务有四种特性,原子性、一致性、隔离性、持久性。

事务,要么全部成功,要么全部失败。好比说我们在银行转钱,你赚钱转到一半,刚刚从你这里把钱扣掉, 但是服务器宕机了,这你怎么办,对面还没有收到钱。所以说,在这个事务中,转钱收钱,要么一起成功,要么就都不成功。

三、MySQL 对事务的支持。

MySQL 中有数据引擎,我们常见的一般就两种,InnoDB 和 MyISAM,这里注意的是,InnoDB 支持事务,而 MyISAM 不支持事务!!!

以下的这些都是针对 InnoDB 说的。

set autocommit = 0; 关闭自动提交,改为手动提交。

set autocommit = 1; 开启自动提交。

start transaction; 启动事务。

begin; 相当于上面的 start transaction。

commit; 提交事务。

rollback; 回滚事务。

savepoint 保存点名称; 设置事务保存点。

rollback to savepoint 保存点名称; 这个是回滚到某一个保存点上。

set transaction 设置事务的隔离级别。

InnoDB 存储引擎提供事务的隔离级别有:读未提交(READ UNCOMMITTED),读提交 (READ COMMITTED),可重复读 (REPEATABLE READ),串行化 (SERIALIZABLE)。

(这个隔离级别先了解即可,比较复杂~~)

四、银行转账实例

这个说多了都没有啥用,我们写个例子感受一下。

首先我们去创建一个 t_user 表。

CREATE TABLE `t_user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `price` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后自己去填写两个数据。

Java Database Connectivity——7. JDBC 事务管理

然后我们创建一个项目,然后写一个方法~

Java Database Connectivity——7. JDBC 事务管理

很简单哈,一个进行扣钱,一个进行加钱,然后一起提交。

我们写个测试类。

Java Database Connectivity——7. JDBC 事务管理

我们运行一下。

Java Database Connectivity——7. JDBC 事务管理

当然哈,这个是正常的时候。

如果我们现在让这个程序出现点异常呢?

来修改一下。

Java Database Connectivity——7. JDBC 事务管理

这段代码肯定报错,然后我们再来运行。

Java Database Connectivity——7. JDBC 事务管理

可以看到,出现异常了, 再来看看数据库。

Java Database Connectivity——7. JDBC 事务管理

???这个 陈2 的钱被扣掉了,但是因为程序报错,这个钱就被扣掉了。而且 陈1 这个人的钱也没有多。

我们说过,类似这样的事情,要么就一起成功,要么就一起失败,不能说,一个人的钱扣了,另外一个人的钱没变。

这里我们引入一下事务。

Java Database Connectivity——7. JDBC 事务管理

我们先把自动提交关闭了,然后进行操作,把我们要操作的东西捕获起来,最后进行提交,如果出现异常,直接回滚。

最后关闭自动提交,来测试一下。

Java Database Connectivity——7. JDBC 事务管理

再来看看数据库

Java Database Connectivity——7. JDBC 事务管理

是没有问题的。

五、回退事务点

这个回退事务点其实很简单。我们来看看怎么操作。

Java Database Connectivity——7. JDBC 事务管理

首先定义一个事务点,我们使用 conn.setSavepoint(); 进行定义。

然后到回滚的时候,我们回滚到事务点即可。

Java Database Connectivity——7. JDBC 事务管理

然后我们来测试一下。

Java Database Connectivity——7. JDBC 事务管理

报错后,来看看数据库。

Java Database Connectivity——7. JDBC 事务管理

是 OK 的哈。

 

大家要好好练习一下, 有问题 QQ 私聊我:2100363119

上一篇:写出Hibernate中核心接口/类的名称,并描述他们各自的责任?


下一篇:django orm 事务