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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

他 他 = new 他()

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值