MYSQL的事务

1、概念

事务就是一组DML(增删改)语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。

2、由来

当一个不支持事务的火车票售票系统有大量用户去访问购买的时候,有这种情况:
当客户端A检查还有一张票时,将票卖掉,还没有执行更新数据库时,客户端B检查了票数,发现大于0,于是又卖了一次票,然后A将票数更新回数据库。这是就出现了同一张票被卖了两次。

3、事务的流程

1start transaction     (开启一个事务)
2savepoint x          (x是名字,表示设置一个名为x的回卷点) (这一步可有可无)
3rollback to x        (如果没第二步就没这一步,这一步表示回卷到x点时候的数据情况)/rollback(没有第二步就用这个)
4commit                (提交所有的操作)

4、事务的隔离级别

那么从上面的例子来看,当我们有多个客户端同时操作数据库的某张表,如何进行隔离操作?MySQL提供了隔离级别。
当MySQL表被多个线程或者客户端开启各自事务操作数据库中的数据时,MySQL提供了一种机制,可以让不同的事务在操作数据时,具有隔离性。从而保证数据的一致性。

4.1、没有隔离级别会发生的问题

脏读
是指当事务A正在访问数据库,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务B也访问这个数据库,虽然事务A的修改没提交,但是事务B却可以看到这个修改。

不可重复读
是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。有两个客户端并开启了事务,有一个客户端A修改了数据而且提交了,另一个客户端B在自己commit之前却可以看到A做出的修改,称为不可重复读(意思为:读了两次,读出的结果不是重复的,即不一样)。

幻读
是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行。

幻读和不可重复读区别
二者都是:同样的条件,读的第一次和第二次的结果是不一样的。
幻读重点在于:增加或删除
不可重复读的重点在于:更改

4.2、事务的隔离级别

**设置事务的隔离级别**set session transaction isolation level read uncommitted / read commited / repeatable read / serializable
查看当前的隔离级别:
select @@tx_isolation;

在这里插入图片描述

5、事务的ACID特性

1、原子性(Atomicity)
事务是应用中最小的执行单位,就如原子是自然界的最小颗粒,具有不可再分的特征一样,事务是应用中不可再分的最小逻辑执行体。

2、一致性(Consistency)
事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而改未完成的事务对数据库所做的修改已被写入数据库,此时数据库就处于一种不正确(不一致)的状态。因此一致性是通过原子性来保证的。

3、隔离性(Isolation)
各个事务的执行互不干扰,任意一个事务的内部操作对其他并发事务都是隔离的。也就是说,并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能互相影响。

4、持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库所做的改变都要记录到永久存储其中(如:磁盘)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值