一、事务的特性ACID
A原子性:事务包含的操作要么全部成功,要么全部失败回滚
C一致性:事务必须使数据库从一个一致的状态变到另外一个一致的状态(满足完整性约束)
I隔离性:多个事务之间不互相干扰
D持久性:一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的
二、事务之间的隔离
2.1、若无隔离
脏读:一个事务处理过程中读取了另一个事务中未提交的数据
不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据进行了修改并提交,导致事务A多次读取同一数据时,结果不一致
幻读:事务A处理全表的数据时,事务B插入一条新的数据,新加入的数据未被处理,事务A就像发生了幻觉一样
不可重复读和幻读,不可重复读针对的是数据项的修改,幻读针对的是数据库的新增or删除
2.2、事务隔离级别
读未提交 --> 脏读,不可重复读,幻读
读已提交 --> 不可重复读,幻读
可重复读 --> 幻读
串行化 -->
三、Mysql的默认级别Repeatable Read
3.1、可重复读定义
事务A中,执行同一条查询语句,得到的结果是一致的。
start transaction;
select * from user; //(1)
insert into user values(?, ?) //(2)
select * from user; //(3)
commit
事务A前后总共执行了两次SELECT语句,这两次SELECT得到的结果是一致的(事务A自己执行的insert语句,是在(3)结果中的)
3.2、破坏可重复读的情况
事务A:
start transaction;
SELECT * FROM user; //(1)
INSERT INTO user VALUES(u1); //(2)
SELECT * FROM user; //(3)
commit
事务B:
start transaction;
INSERT INTO user VALUES(u2); //(1)
commit
事务A在执行完(1)后,事务B执行了(1)且完成提交,这种情况下事务A在执行(3)的时候,应得到的是u1,这个时候是符合可重复读的性质的;如果得到的是u1、u3,这个时候就不是可重复读的;
3.3、Mysql的InnoDB如何实现可重复读?以及该级别下如何解决幻读的问题
3.3.1、基于MVCC解决幻读:使用情况快照读
SELECT * FROM user;
每一个事务,都有一个系统分配的事务id,该id是自动递增的。
Mysql给每一条记录,添加了隐藏的两列,创建时间戳,删除时间戳,记录了一条记录由哪一个事务创建ÿ