事务的四大特性
A:原子性 Atomicity 指的是一个事务中的操作要么全部成功,要么全部失败;如果失败,就回滚到事务开始之前的状态
C:一致性 Consistency 指的是事务必须让数据库从一个一致性的状态变到另外一个一致性的状态,即数据不会被破坏的;如A给B转账100,A和B的总金额是不变的
I :隔离性 Isolation 在并发操作数据库的时候,不同的事务拥有各自的数据空间,它们的操作不会对彼此造成干扰
D:持久性 Durabiliy 一旦事务提交成功,事务中的所有操作都必须持久化到数据库中
四大隔离级别
- READ UNCOMMITED(读取未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- READ COMMITED(读取已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
REPEATBLE READ(可重复读取):对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
SERIALIZABLE(可串行化):最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读
再来说说脏读、不可重复读、幻影读
脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”。
--事务1
update user set name ='张三' where id =1; --这个操作执行的同时,事务2去查询id=1
rollback; --注意事务回滚了,所以上一条操作恢复到初始状态
--事务2
select * from user where id=1; --查询到 name= "张三" , id = 1
不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的
数据是不一样的情况,因此称为不可重复读。
--事务1
select * from user where id=1; --查询到 name="李四", id=1
select * from user where id=1; --查询到 name="张三", id=1
--事务2
update user set name = "张三" where id =1;
--在事务1第一次查询之后,事务2对id=1的name进行修改为 张三
--然后事务1第二次去查询之后得到name=张三
commit;
幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
--事务1
select * from user where id=2; --查询到null,同时事务2提交
select * from user where id=2; --查询到 name="王五", id=2
--事务2
insert into user values("王五",1);
commit;
不可重复读和幻读区别
不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改
幻读的重点在于新增或者删除比如多次读取一条记录发现记录
增多或减少了