MySQL数据库——事务的特性(隔离性)、事务回滚

事务的概念

事务是由一组DML语句组成,完成一个相对完整的功能,这一组DML语句要么全部执行,要么全部放弃执行。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

或者这样理解:

事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

事务的特性

事务具有四个特性:原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持续性(Durability)。这四个特性也简称ACID性。

  1. 原子性:是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。就如原子是自然界最小颗粒,具有不可再分的特征一样。

  2. 一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。(双方账户的总和不能少也不能多)

  3. 隔离性:各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。(简单的理解 就是你做你的,我做我的!)

  4. 持续性:持续性也称为持久性,指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库。(转账记录成功了,不能过一会变成了出错了)

事务回滚

事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的
工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。

要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。

而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出
现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚。

关于隔离性的补充

隔离性:当多个线程都开启事务来操作数据库中的数据时,数据库系统要进行隔离操作,以保证各个线程获取数据的准确性。

不考虑事务的隔离性,会产生的几种问题:

  1. 脏读

是指一个事务处理过程里读取了另一个未提交的事务中的数据,然后使用了这个数据;
例:用户A向用户B转账100元,A通知B查看账户,B发现前确实已到账,而之后无论第二条
SQL是否执行,只要该事务不提交,则所有操作都将回滚,当B再次查看账户时就会发现前
其实并没有到账。

  1. 不可重复读

不可重复读是指在一个事务内,多次读取同一个数据,在这个事务还没有结束 ,另一个事
务也访问该同一数据,但是由于第二个事务的修改,那么第一个事务两次读取的数据可能不
一样,因此称为不可重复读;即同一个事务中原始数据读取不可重复。 注:不可重复读和
脏读的区别,脏读是某一个事务读取另一个事务未提交的脏数据; 不可重复读则是读取前一
事务提

  1. 幻读:

当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行修改,这种
数据涉及到表中的全部数据行,同时,第二个事务也对这个表数据进行修改,这个修改是对
表中新增/删除一条数据,那么操作第一个事务的用户发现表中的数据还没有修改的数据
行,就好像发生了幻觉一样,这就是发生了幻读。
注:幻读和不可重复读都读取另一条已经提交的事务,所不同的是不可重复读查询的都是同
一数据项,而幻读针对的是一批数据整体。

数据库提供的四种隔离级别:

  1. Read uncommitted(读未提交):最低级别,任何情况都会发生。
  2. Read Committed(读已提交):可避免脏读的发生。
  3. Repeatable read(可重复读):可避免脏读、不可重复读的发生。
  4. Serializable(串行化):避免脏读、不可重复读,幻读的发生。

注: 四种隔离级别最高:Seralizable级别,最低的是Read uncommitted级别; 级别越高,执行效
率就越低;

数据库开启事务命令

start transaction 或者 begin 开启事务

commit 提交事务,提交未存储的事务

rollback 回滚事务,即撤销指定的sql语句(回退insert delete update语句)
rollback to 保留点名称。

savepoint 保留点 ,事务处理中设置的临时占位符 你可以对它发布回退。

案例1:博文给 小宇 转账 100块钱。

首先建立一个表格
​​在这里插入图片描述

start   transaction;

update account set money=money-100 where name ='zs';

update account set money = money+100 where name = 'ls';

COMMIT;
select    *   from account;

视图如下:
在这里插入图片描述
如果出现下面情况,博文 给 晓宇 转账100块钱,中间出差。

start TRANSACTION;

update account set money=money-100 where name ='zs';

-- 错误语句

insert into account(id,name,money) values(3,'ww',1000,333);

update account set money = money+100 where name = 'ls';

COMMIT;

rollback和savepoint的训练

向t5表格中添加两条数据,然后再回滚到原始值。
首先,先建立一个t5的表格

create table t5(id int PRIMARY key auto_increment,
name varchar(20),
gender varchar(20));

然后向表格里插入数据

insert into t5(name,gender) values('zs','man');

insert into t5(name,gender) values('ls','man');

insert into t5(name,gender) values('ww','man');

insert into t5(name,gender) values('zq','man');

start TRANSACTION;

insert into t5(name,gender) values('张飞','man');

insert into t5(name,gender) values('关羽','man');

ROLLBACK;
select   *   from t5;

在这里插入图片描述

注意:默认回滚到开启事务位置。

设置回滚点

start TRANSACTION;

insert into t5(name,gender) values('张飞','man');

SAVEPOINT s1;

insert into t5(name,gender) values('关羽','man');

SAVEPOINT s2;

insert into t5(name,gender) values('刘备','man');

SAVEPOINT s3;

insert into t5(name,gender) values('赵云','man');

select * from t5;

ROLLBACK to s2;

select * from t5;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值