Mysql 之 事务

Mysql事务

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务

事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么操作全部执行,要么操作全部不执行。

事务特性

事务需要满足4个特性,也就是我们平时经常说的ACID,现在介绍一下:

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

事务的原子性(由DBMS的事务管理子系统来实现)

一个事务(transaction)中的所有操作,要么这些操作全部都成功完成,若有一个操作失败,那么这些操作全部不失败,不会结束在中间某个环节。

事务在执行过程中发生错误,可以进行回滚(Rollback)到事务开始前的状态,就像是这个事务未执行一样

事务的一致性(由DBMS的完整性子系统执行测试任务)

在一个事务在开始之前和结束以后,数据库的完整性没有被破坏。

事务的隔离性(由DBMS的并发控制子系统实现)

对数据库操作的时候,我们可以同时进行多个并发事务进行操作,来同时对数据进行读写与修改。而隔离性就是防止多个事务在并发执行时由于交叉执行而导致数据的不一致。

事务隔离有多个不同级别,包括

  • 读未提交(Read uncommitted)
  • 读已提交(read committed)
  • 可重复读(repeatable read)
  • 串行化(Serializable)

下面会进行介绍

事务的持久性(由DBMS的恢复管理子系统实现的)

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

事务的隔离级别

Mysql 之 事务_第1张图片

数据库种,InnoDB默认是可重复读级别的

说明:

  • 脏读 : 脏读就是读取到还未提交的数据。
    解决方案:修改隔离级别,将其改为读已提交或者可重复读或者可串行化。
  • 不可重复读 : 一个事务内两次读到的数据是不一样的称为是不可重复读。在一个事务内在多次读取数据的间隙其他事务对数据进行了修改,导致读取的数据不是同一个数据。
    解决方案:修改隔离级别,将其改为可重复读或者可串行化。
  • 幻读 : 幻读是觉得数据行记录变多了或者少了。也就是说,在一个事务读取多行数据的时候其他事务进行了行增加或者行减少。
    解决方案:(1)多并发版本控制(MVCC)(MVCC在快照读时可以解决幻读)、(2)next-key锁(当前读解决幻读)

总结

  • 脏读是指读取了未修改完的记录。
  • 不可重复读指因为被其它事务修改了记录导致某事务两次读取记录不一致
  • 幻读是指因为其它事务对表做了增删导致某事务两次读取的表记录数不一致问题

传播行为

  • PROPAGATION_REQUIRED:存在事务,就加入该事务,不存在事务,就创建一新事务
  • PROPAGATION_REQUIRES_NEW:无论当前存不存在事务,都创建一个新事务。
  • PROPAGATION_SUPPORTS:存在事务,就加入该事务,不存在事务,就以非事务执行。
  • PROPAGATION_NOT_SUPPORTED:以非事务方式执行,存在事务,就把当前事务挂起。
  • PROPAGATION_NESTED:存在事务,则在嵌套事务内执行。不存在事务,则执行与PROPAGATION_REQUIRED类似的操作
  • PROPAGATION_MANDATORY:存在事务,就加入该事务,不存在事务,就抛出异常。
  • PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

你可能感兴趣的:(数据库,面试,数据库,mysql)