2019-04-15 | 事务 | UNLOCK

简单聊聊我理解的事务及实现原理

什么是事务?

首先什么是事务?,我个人的理解就是 我早上去坐公交车,我刷了卡,你就不能让我下车。要么我不刷卡,司机可以让我下车,但是我刷了卡,司机就不能赶我下车。(刷卡->上车) (不刷卡(失败)->不能上车) 两件事要么同时成功,要么同时失败!
sss
学事务我们必须知道ACID(我管这个叫一个条子),为什么呢? 香港皇家警察 就是 叫CID,看过港片的都懂。ACID 分别代表什么呢?带着这疑问我们一一来讲解下.

A——->原子性
C——->一致性
I——–>隔离性
D——->持久性

1.原子性: 这个来源于 物理学,初中物理课本都讲过,原子是不可再分的最小单位(白话:原子表示这已经是最小的单位了,不能再分了),这里我们把事务看做原子,事务里面的操作要么一起成功,要么一起失败,没有其它选择,只要其中一个操作失败了,那么整个事务就会回滚。 就是 要么 我刷卡上车,要么不刷卡 不上车,不能我刷了卡 不让我上车。
//依靠Undo log实现,为了保证事务的原子性,例如在修改数据时,mysql 先将修改之前的数据保存到Undo log中,到发生事务回滚 则从Undo log 中恢复数据。

2.一致性: 指的是数据的一致性,比如,我从支付宝转1000 元 给 张三,一致性表示 我的余额要-1000,张三 余额 + 1000 ,不可能出现我-1000 而张三的余额没有变化,或是我的余额不变化,张三的余额+1000的情况。
//依靠Undo log实现,为了保证事务的原子性,例如在修改数据时,mysql 先将修改之前的数据保存到Undo log中,到发生事务回滚 则从Undo log 中恢复数据。

3.隔离性:比如我在给 张三转 1W元,马云在给他老婆转1个亿,不可能发生 张三收到了1个亿,而马云的老婆收到了1W的情况, 两个事务之间是相互隔离的,数据不可能串。
事务有四种事务隔离级别:
//依靠 mysql 的锁机制实现 事务的隔离

PS:mysql默认的事务处理级别是’REPEATABLE-READ’(不可重复读)

1
2
3
4
5
6
7
8
1.READ UNCOMMITTED ----->session会话A 可以读取到session会话B没有提交的更改数据(该数据可能产生回滚),即产生了脏读


2.READ COMMITTED --------->session会话A<只>可以读取到session会话B已提交的更改数据,但是可能读取两次可能会是不同的数据(别的并发事务又修改了这条数据),即产生了 “”不可重复读“”

3.REPEATABLE READ---------->并发事务中,事务会话A 不能查询到 事务会话B未提交的和已提交的数据,但是 update/insert/delete 确能够对事务会话B提交的数据产生效果。感觉 查不到,但是update/insert/delete 确是生效的,有种迷幻的感觉,这就是幻读。

4.SERIALIZABLE ----------->使事务串行化执行,避免了脏读,不可重复读,幻读等问题,这里本质上是让并发执行的事务串行,一个一个排队执行,对性能影响较为严重,浪费性能, 建议慎用。合理选择适用的业务场景。

4.持久性:只要事务成功了,那么数据一定会保存到数据库,即使在事务成功了,还没有保存成功之前服务器断电了,当服务器重启后,数据库也会从日志文件中恢复数据,
//依靠 Redo log 实现数据的持久性,如上事务成功之前mysql会把新数据 写入Redo log ,断电恢复服务后,mysql会从 Redo log 中读取恢复数据。

我们常用的mysql的Innodb支持事务但是MyiSAM不支持事务。

评论加载中