关于数据库事务和锁的必会知识点,你掌握了多少?

这些必会的计算机网络知识点你都掌握了吗

关于数据库索引,必须掌握的知识点

数据库事务 什么是数据库的事务

百度百科的解释:数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

事务的四大特性是什么?

原子性:原子性是指包含事务的操作要么全部执行成功,要么全部失败回滚。

一致性:一致性指事务在执行前后状态是一致的。

隔离性:一个事务所进行的修改在最终提交之前,对其他事务是不可见的。

持久性:数据一旦提交,其所作的修改将永久地保存到数据库中。

数据库的并发一致性问题

当多个事务并发执行时,可能会出现以下问题:

脏读:事务A更新了数据,但还没有提交,这时事务B读取到事务A更新后的数据,然后事务A回滚了,事务B读取到的数据就成为脏数据了。

不可重复读:事务A对数据进行多次读取,事务B在事务A多次读取的过程中执行了更新操作并提交了,导致事务A多次读取到的数据并不一致。

幻读:事务A在读取数据后,事务B向事务A读取的数据中插入了几条数据,事务A再次读取数据时发现多了几条数据,和之前读取的数据不一致。

丢失修改:事务A和事务B都对同一个数据进行修改,事务A先修改,事务B随后修改,事务B的修改覆盖了事务A的修改。

不可重复度和幻读看起来比较像,它们主要的区别是:在不可重复读中,发现数据不一致主要是数据被更新了。在幻读中,发现数据不一致主要是数据增多或者减少了。

数据库的隔离级别有哪些?

未提交读:一个事务在提交前,它的修改对其他事务也是可见的。

提交读:一个事务提交之后,它的修改才能被其他事务看到。

可重复读:在同一个事务中多次读取到的数据是一致的。

串行化:需要加实现,会强制事务串行执行。

数据库的隔离级别分别可以解决数据库的脏读、不可重复读、幻读等问题。

隔离级别 脏读 不可重复读 幻读
未提交读   允许   允许   允许  
提交读   不允许   允许   允许  
可重复读   不允许   不允许   允许  
串行化   不允许   不允许   不允许  

MySQL的默认隔离级别是可重复读。

隔离级别是如何实现的?

事务的隔离机制主要是依靠机制和MVCC(多版本并发控制)实现的,提交读和可重复读可以通过MVCC实现,串行化可以通过锁机制实现。

什么是MVCC?

MVCC(multiple version concurrent control)是一种控制并发的方法,主要用来提高数据库的并发性能。

在了解MVCC时应该先了解当前读和快照读。

当前读:读取的是数据库的最新版本,并且在读取时要保证其他事务不会修该当前记录,所以会对读取的记录加锁。

快照读:不加锁读取操作即为快照读,使用MVCC来读取快照中的数据,避免加锁带来的性能损耗。

可以看到MVCC的作用就是在不加锁的情况下,解决数据库读写冲突问题,并且解决脏读、幻读、不可重复读等问题,但是不能解决丢失修改问题。

MVCC的实现原理:

版本号

系统版本号:是一个自增的ID,每开启一个事务,系统版本号都会递增。

事务版本号:事务版本号就是事务开始时的系统版本号,可以通过事务版本号的大小判断事务的时间顺序。

行记录隐藏的列

DB_ROW_ID:所需空间6byte,隐含的自增ID,用来生成聚簇索引,如果数据表没有指定聚簇索引,InnoDB会利用这个隐藏ID创建聚簇索引。

DB_TRX_ID:所需空间6byte,最近修改的事务ID,记录创建这条记录或最后一次修改这条记录的事务ID。

DB_ROLL_PTR:所需空间7byte,回滚指针,指向这条记录的上一个版本。

它们大致长这样,省略了具体字段的值。·

在这里插入图片描述

undo日志

MVCC做使用到的快照会存储在Undo日志中,该日志通过回滚指针将一个一个数据行的所有快照连接起来。它们大致长这样。

在这里插入图片描述

举一个简单的例子说明下,比如最开始的某条记录长这样

在这里插入图片描述

现在来了一个事务对他的年龄字段进行了修改,变成了这样

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjfzp.html