MySQL 事务
1、什么是事务?
事务就是「一组原子性的SQL查询」,或者说一个独立的工作单元。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。ACID 四大特性是事务的基础。
2、什么是ACID特性?
ACID具体的含义是这样的:
原子性(atomicity) 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作。
一致性(consistency) 数据库总是从一个一致性的状态转换到另外一个一致性的状态。在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
隔离性(isolation) 通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
持久性(durability) 一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。持久性是个有点模糊的概念,因为实际上持久性也分很多不同的级别。有些持久性策略能够提供非常强的安全保障,而有些则未必。而且「不可能有能做到100%的持久性保证的策略」否则还需要备份做什么。
3、什么是脏读、幻读和不可重复读?该如何解决?
脏读 :读取到另一个事务中未提交的数据, 称为脏读(dirty read)。
不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务再修改数据。那么第一个事务两次读到的的数据可能是不一样的,因此称为是不可重复读。
幻读:所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(phantom row)。
nnoDB和XtraDB存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)解决了幻读的问题
解决方法: 修改Mysql的事务隔离级别
4、MySQL事务的四个隔离级别的区别? 解决了什么问题?
SQL 92 定义了四个隔离级别 (Isolation (database systems) - Wikipedia), 其隔离程度由高到低是:
串行化 (Serializable): 该级别通过强制事务按序执行,使不同事务之间不可能产生冲突,从而解决了前面说的幻读问题。最严格的级别,事务串行执行,资源消耗最大;简单来说,串行化会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。
可重复读(REPEATABLE READ) : 保证了在同一个事务中多次读取相同行数据的结果是一样的。避免了“脏读”和“不可重复读取”的情况,但不能避免“幻读”(InnoDB通过间隙所解决了幻读问题),但是带来了更多的性能损失。
提交读(READ COMMITTED): 大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读”,但不能避免“幻读”和“不可重复读取”。该级别适用于大多数系统。
未提交读(Read Uncommitted): 事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。
隔离级别解决什么问题? 用通俗的语言描述就是:加一个针对数据资源的锁,从而保证数据操作过程中的一致性。
5、什么是自动提交?
MySQL默认采用自动提交AUTOCOMMIT模式。也就是说,如果不是显式地开始一个事务,则每个查询都被当作一个事务执行提交操作。
Last updated