美文网首页
MySql 事务总结 - 基础篇

MySql 事务总结 - 基础篇

作者: 编程人生 | 来源:发表于2022-01-09 09:33 被阅读0次

    一.什么事务

    事务是单个工作单元,是数据库中不可再分的基本部分.具体来说,事务是由用户定义的一个sql语句序列,在这组sql

    序列中,每个mysql语句时相互依赖的,整个sql语句组是一个不可分割的整体.如果在这个sql语句组某条sql语句一旦执行

    失败或产生错误,整个语句将会回滚,即将数据表中的数据返回到这个sql语句组开始执行前的状态.

    二.事务的4个属性ACID

    1.原子性(Atomicity):事务由一个或一组相互关联的sql语句组成, 这些语句被认为是一个不可分割的单元,对事务进行

    修改只能是完全提交或完全回滚

    2.一致性(Consistency):事务的一致性保含两层意思: 一是从数据的角度来看,事务必须是使数据库从一个一致性

    变为另一个一致性,一致性与原子性密切相关,在事务开始之前和结束之后,数据库的完整性约束没有被破坏;而是从

    用户的角度看,事务可确保对数据库修改是一致的,即多个用户查询到的数是一样的.

    3.隔离性(Isolation,孤立性):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他

    事务是隔离的,并发执行的各个事务之间不应该相互干扰,这些通过锁来实现.实际应用中,事务的相互影响程度受到隔离

    级别的影响.

    4.持久性(Durability):指一个事务一旦提交后,对数据的修改和更新及时永久的.

    三.InnoDB引擎引入了与事务处理相关的UNDO日志和REDO日志.

    1.UNDO日志

    为了满足事务的原子性,在操作数据前,首先将数据备份到UNDO日志文件里.然后进行数据的修改,如果出现错误或者

    用户执行了ROLLBACK语句, 系统可以利用Undo日志文件中的备份将数据恢复到事务开始之前的状态

    2.REDO日志

    和UNDO日志相反,REDO日志记录的是新数据的备份.在数据提交前,不需要将新的数据持久化,只要将REDO日志持久化

    即可.此时虽然新的数据没有持久化,但redo日志已经持久化了,在系统崩溃时可以根据REDO日志的内容,将所有数据

    恢复到最新的状态.

    四.事务的控制

    start transaction| begin 用于开启一个事务

    commit 表示提交一个事务

    rollback 表示回滚一个事务

    set autocommit = {0|1}表示用于设置提交事务的默认方式,0 表示禁用自动提交事务, 1 表示自动提交事务.

    and chain 表示会在当前事务结束时立刻启动一个新的事务,并且新事务与刚结束的事务有相同的隔离等级;

    release 表示在终止了当前事务后,会让服务器断开与当前客户端的连接.如果加上 no,则可以抑制chain 和release

    的完成.

    五.事务的隔离级别

    脏读(DIrty Read): 一个事务读取到了另一个事务未提交的的数据操作结果.

    不可重复读(Non-repeatable Reads):一个事务对同一行重复数据重复读两次,但却得到了不同的结果,即产生了虚

    读,也就是当事务读取某一数据后, 事务二对其做了修改,当事务再次读该数据时得到与第一次不同的值.

    幻读(Phantom Reads):指事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者

    缺少了第一次查询中出现的数据,这是由于在两次查询过程中有另外一个事务更新了数据造成的.

    1.读未提交

    为了避免未授权读取,允许脏读,但不允许更新丢失.如果一个事务已经开始了写数据,则另一个事务则不允许同时进行

    写操作,但允许其他事务读此行数据.该隔离级别可以通过"排他写锁"实现.在该隔离级别,所有事务都可以看到其他

    未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.

    2.读已提交

    这是大多数数据库系统的默认隔离级别(但Mysql默认是不是这个级别).读提交的特点是:一个事务只能看见已经提交事务所做的改变:支持不可重复读,读数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行.

    3.可重复度

    这是Mysql的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时会看到同样的数据行.可重复读可能

    会产生幻读的问题.

    4.可串行化(Serializable)

    这是最高的隔离级别,它通过强制事务排序,使事务只能一个接一个执行,不能并发执行,这样就从根本上阻止了事务之间的相互冲突,从而解决幻读问题.

    修改事务隔离级别的语法规则:

    set[Global|session]Transation isolation level read uncommitted | Read committed | Repeatable read|

    Serializable ;

    Global 表示此语句将应用于在此之后所有session,而当前已经存在的session不受影响."session"表示此语句将应用于在此之后所有session之内的以及之后的所有事务;

    session

    表示此语句将应用于包括当前session在内的及其后的所有事务;如果缺省.表示此语句将应用于当前session在内的

    后面未开始事务."Read uncommitted | Read committed | Repeatable read | Serializable"分别表示设置为读未

    提交/读以提交,可重复读 和可串行化.

    相关文章

      网友评论

          本文标题:MySql 事务总结 - 基础篇

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