概述
问题:什么是事务?
- 事务是数据库操作的最小工作单元,一个事务中的所有SQL语句作为一个整体一起向系统提交,要么都执行、要么都不执行。
- 事务是主要是为了解决多个SQL语句操作时,带来的多个事务并发执行的问题。主要是为了原子性、一致性、隔离性。
- 注意:单句SQL语句提交执行本身也是一次事务。
问题:什么ACID?
- 原子性(Atomic):操作不可再分,事务的所有操作要么全部执行,要么全部失败 。
- 一致性(Consistency):事务执行前后数据关系不被破坏。
- 隔离性(Isolation):多个事务间执行隔离(支持并发),单个事务的执行不应该影响其他事务的执行。
- 持久性(Durability):对数据库的修改,应永久存在,故障可恢复。但不存在100%的持久性
问题:多个事务并发会带来什么问题?
- 脏读:事务之间没有隔离,操作数据时互相影响。(由于查询操作产生)
- 例子:事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。
- 不可重复读:两个事务互相隔离,但当两个事务同时操作,并且其中一个事务提交完成后,对数据进行了修改,对另一个事务是存在影响的。(由于修改操作而产生的)。
- 例子:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
- 幻读:事务A读多条数据时,有可能因为事务B插入了新的数据,导致事务A在多次读取中数据数目不一致。(由于插入或删除操作而产生的)
- 例子:事务T1读取某表的数据,事务T2读取并删除或添加了该表的数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果(删除或添加了数据)。
问题:事务隔离级别如何解决并发带来的问题?
事务隔离级别 | 更新丢失 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
未提交读 | 避免 | 发生 | 发生 | 发生 |
已提交读 | 避免 | 避免 | 发生 | 发生 |
可重复读 | 避免 | 避免 | 避免 | 发生 |
串行化 | 避免 | 避免 | 避免 | 避免 |
- 未提交读:事务之间无隔离,所有的操作都会互相影响。
- 提交读:一个事务只在完成数据提交后,才会对其他未完成的事务的数据产生影响。
- 可重复读:事务完全隔离,每个事务内的数据独立,不受其他事务影响。(牺牲空间,数据冗余)
- 串行化:一个事务执行完才能下一个事务执行(牺牲性能)
问题:InnoDB是如何在可重复读的事务隔离级别下解决幻读?
- InnoDB默认情况下是采用“可重复读”级别的事务隔离等级
- 在快照读情况下,mysql通过mvcc来避免幻读
- 在当前读情况下,mysql通过next-key(行锁+间歇锁)来避免幻。
问题:什么是当前读、快照读?
- 当前读:加了锁的增删改查语句
- 查询:select … lock in share mode,select … for update
- 数据修改:update, delete, insert
- 不加锁的非阻塞读
- 直接查询:select
问题:什么是MVCC(多版本并发控制)?
- 版本号机制
- 给每个事务一个序号作为版本号
- 给每个行增加一个版本号
- 每个事务中的行数据都是一个独立的版本号
- 每个事务获取一行数据时,都会在使行数据在事务内版本号+1(提交前不影响实际版本号),然后事务每次读数据时,只能读到比事务内版本号低的数据版本。
- 对于删除的数据,高版本的事务标记了一个deleted标记在数据中,不影响低版本的事务查看到数据。
问题:什么是间歇锁?
- 间歇锁(Gap锁):实际上是对索引前后的间隙上锁,不对索引本身上锁。
- Gap锁会用在非唯一索引或者不走索引的当前读中。
- 根据检索条件向左寻找最靠近检索条件的记录值A,作为左区间,向右寻找最靠近检索条件的记录值B作为右区间,即锁定的间隙为(A,B)。
- Gap锁如何避免幻读?
- 防止间隙内有新数据被插入
- 防止已存在的数据,更新成间隙内的数据
- 不适用情况:对主键索引或者唯一索引时不一定适用GAP锁
- 如果where条件全部命中,则不会用GAP锁,只会加行锁
- 如果where条件部分命中或者全不命中,则会加Gap锁
问题:什么是表级锁与行级锁?
- 表级锁:锁对整张表都存在影响。
- 行级锁:仅针对要处理的行数据存在影响。
- 行与表中的读锁与写锁:
- 读锁也称为共享锁。读锁上锁后,其他并发的线程也能进行读操作并上读锁。
- 写锁也称为排它锁。上了锁后,就不能再上写锁或读锁,也就是不能进行写操作和读操作。
参考:
https://www.cnblogs.com/fanguangdexiaoyuer/p/10759746.html
https://www.cnblogs.com/jesssey/p/7771149.html
https://baijiahao.baidu.com/s?id=1629409989970483292&wfr=spider&for=pc
最后
以上就是真实香菇为你收集整理的数据库基础:入门理解事务的全部内容,希望文章能够帮你解决数据库基础:入门理解事务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复