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

一、什么是事务

直接百科

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

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

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

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

二、事务的特性

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

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

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

三、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;

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

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

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

我们写个测试类。

我们运行一下。

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

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

来修改一下。

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

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

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

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

这里我们引入一下事务。

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

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

再来看看数据库

是没有问题的。

五、回退事务点

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

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

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

然后我们来测试一下。

报错后,来看看数据库。

是 OK 的哈。

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

猜你喜欢

转载自blog.csdn.net/weixin_45908370/article/details/115123314