阅读 142

数据库基础:入门理解事务

数据库基础:入门理解事务

问题:什么是事务?

事务是数据库操作的最小工作单元,一个事务中的所有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

————————————————

版权声明:本文为CSDN博主「萌白在努力」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/k295330167/article/details/116106814


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐