美文网首页
Mysql事务&隔离级别

Mysql事务&隔离级别

作者: 365_9163 | 来源:发表于2020-09-11 17:54 被阅读0次

    数据库事务:ACID特性

        原子性:

                        事务中所有操作要么全部提交成功,要么全部失败回滚。

                           undo实现原子性:开启一个事务修改一个字段时候,undo存放修改前的数据,然后刷新到磁盘中,在commit 操作日志记录存放到磁盘之前保证所有的修改的数据都已经磁盘存盘;宕机后,查看undo日志,存在commit则无需进行回滚操作,如果没有commit则取出undo中数据进行数据库更新操作,实现数据原子性。

        一致性:

                        数据库总是从一个一致性的状态转换为另一个一致性的状态,事务前后数据的完整性必须保持一致。

        隔离性:

                    一个事务所做的修改在提交之前对其他事务是不可见的。

        持久性:

                一旦事务提交,所做的修改便会永久性保存在数据库中。

    事务的执行如何保证原子性

                    事务执行过程中,事务操作是个临时表,所有的操作在临时表中执行,每一个事务执行都有一个undolog,作为临时表,回滚:一条执行不成功,直接返回,不影响行表中数据

    存储引擎 Innodb:

            innodb是一种平衡高可靠性和高性能的通用存储引擎,mysql5.6的默认存储引擎。根节点常驻内存,查找某一键值的行记录最多只需1~3次磁盘I/O操作。

              优势:遵循ACID模型,具有提交,回滚,崩溃恢复功能的事务保护用户数据。

    INNODB与MyISAM对比:

    Innodb数据存储在叶子节点上 存储的是数据  myisam是可以把整个树放到内存里面的,innodb把一部份数据放在内存中

    Myisam在内存中查询到数据的地址,然后再去磁盘中取数据,

    Myisam数据存放在另外的地方,MyISAM存储的是地址

    全文索引:MyISAM 数据和索引是分开存储的

    innodb数据存放在叶子节点中,全文存储的话,叶子节点会比较大,不适合存储。

    innodb支持事务,采用了行级锁。


    事务隔离级别:

            read uncommitted(读未提交):

                    一个事务还未提交,他做的变更就能被其他事务看到。出现脏读的现象,A事务更新未提交,B事务读取更新后的数据,A回滚,B再次读取 前后不一致,可能出现脏读 不可重复读,幻读。(左边终端作为A,右边终端作为B),首先查看当前的事务隔离级别(标识1)这也是mysql引擎innodb默认的隔离级别;设置级别为读未提交(标识2),设置后再次查看隔离级别已经变成了读未提交(标识3),A终端进行查看看数据库表中一条信息(标识4),此刻查出name是qaz,B终端开启事务(标识5),查询数据(标识6),进行数据更新操作(标识7),将id为1的name修改为123,此时事务尚未提交,A终端进行查询,发现name已经更新成了123(标识8),B终端进行事务回滚(标识9)之后,A终端再次查看发现name还是之前的qaz(标识10),在A整个查看信息的过程中会出现脏读(数次读取不一致),由于其他事务的更改但尚未提交造成数次读取不一致的情况。

            read committed(读提交):

                一个事务在对数据进行修改提交之后其他事务才可以看见。出现不可重复读的现象,A读取数据,B读取并且更新了该项数据,B事务提交,A再次读取该数据,此时A事务发生异常。称之为不可重复读。

    读提交

            repeatable read(可重复读):

                    一个事务执行过程中看到的数据是一致的,未提交的更改对其他事务是不可见的。A事务查询符合条件的数据项,B在表中插入了一条数据刚好是符合A查询的条件并提交,A事务以同样的标准查询该表,发现两次查询结果不一致,出现了幻读。

            serializable(串行读):

                        对应的一个记录会加读写锁,出现冲突的时候,后访问的事务必须等到前一个事务执行完成 才能继续执行。A事务对表进行事务处理,此时B事务对表进行操作的时候处于挂起等待的状态

    多版本并发控制:

                是指在使用读提交 和可重复读这两种隔离级别下 的事务在执行普通的select操作时访问记录版本链的过程,可以使用不同事务的读写,写读操作并发执行,从而提高系统性能

        mysql中存在一个一个版本链和readview结构:

        版本链中存放所有事务的id。

        readview结构中m_ids  存放所有未提交的事务id。

    比如 版本链中事务列表是 1 2 3 4 5,readview中m_ids列表是 5

    读提交隔离级别下:新事务开启,生成新的readview id6, 复制4的内容,(5尚未提交,所有看不到),在 id为6事务中,再次select时会生成新的id7,此时如果5提交了,复制5放入内容,5没提交,复制4的内容 ;这就是同一个事务中(6,7)看到另一个事务(5)提交的。

    可重复读:新事务开启,事务id6, 复制4的内容,在 id为6事务中,再次select时依然在id是6中,不重新生成readview,在同一个事务中看到的永远是首次查询的内容。

    相关文章

      网友评论

          本文标题:Mysql事务&隔离级别

          本文链接:https://www.haomeiwen.com/subject/kqgazhtx.html