数据库基础:入门理解事务
数据库基础:入门理解事务
问题:什么是事务?
事务是数据库操作的最小工作单元,一个事务中的所有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