【JavaWeb】事务是什么?

一、转账案例

转账,相信基本都接触过,无论是线下用银行卡转账还是线上用手机转账,本质上都是差不多的。
需要两个账户:刘小爱账户和刘妈妈账户;刘小爱账户转出;刘妈妈账户转入。
在数据库中用sql语句编写一个账户信息表,表很简单:主要两个属性,一个是账户名,一个是账户余额。
现在编写代码:

  • 刘小爱账户给刘妈妈账户转1000
  • 刘小爱账户余额减少1000
  • 刘妈妈账户余额增加1000

在这里插入图片描述

①提示用户输入信息
就用Java中的控制台来模拟,也就是Scanner这个类的使用。

②从德鲁伊连接池中获取连接
这个我们将德鲁伊连接池封装进工具类JdbcUtil,所以可以直接用工具类获取连接。

③转出账户预编译
转出账户名为inName,转出的金额为money,那么要将数据库中对应账户名的money减少对应的金额。

④转入账户预编译
转入账户名为outName,转入金额为money,那么要将数据库中对应账户名的money增加对应的金额。
代码编写完成,现在再做测试:
在这里插入图片描述
指定转出账户为:刘小爱
指定转入账户为:刘妈妈
设定转账金额为:1000

二、事务的引入

要知道我们转账本质上是转出方先将钱转到银行,银行再将钱转入到转入方。
这样就会存在一个问题:
比如刘小爱的钱从他的账户中转出去了,但是银行还没有将钱转到刘妈妈的账户中,突然银行发生了突发事故,就是没法转钱到刘妈妈账户上了。

用代码模拟这种情况:
上面有异常是直接throws了,现在要自行处理。
使用IDEA开发工具快捷键Ctrl+Alt+T:可以选择一块代码try……catch

在这里插入图片描述
①转出账户
这段代码就相当于刘小爱账户里的钱转到银行了。

②自己写一个异常
我们都知道分母是不能为0的,也就是说程序执行到这里会报错。
这个是用来模拟银行出事了。

③转入账户
本来银行是应该将钱转入到刘妈妈账户的,但是因为发生了异常,导致这段代码没法执行。
我们看看最终的结果:
在这里插入图片描述
刘小爱账户里的钱减少了,但是刘妈妈账户里的钱没有增加。
这是不行的,所以为了解决这个问题,数据库就引入了事务的概念。
事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败。
以上面的这个例子来说明就是:

  • 有两个操作:转出账户和转入账户。
  • 转出成功,转入成功,就成功了。
  • 成功了,事务提交,转账完成。
  • 转出成功,转入失败,那对不起,全部失败。
  • 转出失败,转入成功,也还是失败。
  • 失败了,事务回滚,回到转账前的状态。

二、事务操作

1、mysql中的事务
在这里插入图片描述
①mysql中开启事务

start transaction;
transaction,就是事务的意思。

②mysql中事务提交
commit;就是提交的意思。

③mysql中事务回滚
rollback;就是回滚的意思,回滚是什么意思呢?
就可以理解成回到开启事务时的状态。

2、Java中的事务
在这里插入图片描述
①Java中开启事务
Java中连接接口collection有一个api叫setAutoCommit()
翻译过来就是设置自动提交,顾名思义也就是说:
如果是true,事务会自动提交;
如果是false,事务不自动提交。
将其设置成false,我们手动提交。

②Java中提交事务
collection也有一个commit()方法,顾名思义也就是提交的意思。

③Java中回滚事务
collection还有一个rollback()方法,顾名思义也就是回滚的意思。

那么事务不提交和事务回滚的区别是什么?
我们先说一下事务的流程,在开启事务之后,对数据的增删改查,都只是将操作记录更新到事务日志中,如果想要数据更新到数据库中,我们就需要进行事务提交的操作,成功的提交,会将所有的DML(insert、update、delete)语句操作历史记录和底层硬盘数据来一次同步进而保存到数据库,如果不提交事务的话,事务日志中的操作记录则不会同步到数据库中。
而回滚则是在进行事务操作中遇到问题,这时候会将事务日志中所有的DML(insert、update、delete)语句操作历史记录全部清空,自然也不会同步到数据库中了。

三、事务的四大特性

1.原子性(Atomicity)

我们知道一个概念:原子是物质的最小单位,是不可再分割的。所以说在事务中,原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败,还有转账的例子,我转出的给你的钱,必须转入到你的账户才行,不能我转出了,却没转入你的账户,这都是不符合原子性的操作。

2 一致性(Consistency)

就是在事务开启和关闭之后,数据库的数据前后要保持一致性。

举例说明:张三向李四转100元,转账前和转账后的总的钱是不变的,这就叫一致性,如果出现张三转出100元,李四账号没有增加100元这就出现了数据错误,就没有达到一致性。

3 隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

4 持久性(Durability)

一个事务成功完成之后,它对数据库所作的改变是永久性的,即使系统出现故障也是如此。也就是说,一旦事务被提交,事务对数据所做的任何变动都会被永久地保留在数据库中。

猜你喜欢

转载自blog.csdn.net/wang_qiu_hao/article/details/125214608