Mysql事务隔离级别

1.事务的ACID特性

原子性(Atomicity):要么全部完成,要么全部取消,不存在执行一半的情况,即使跑了十个小时,报错了也要回滚

 一致性(Consistency):事务操作成功后,不会被破坏,和业务规则一致

 隔离性(Isolation):事务之间互不干扰,各自独立,可以让多个线程并发访问数据库

 持久性(Durability):数据必须持久化到数据库(磁盘)上,已提交的事务,即使因为数据库崩溃,重启时也能够根据日志对未持久化的数据进行重执行

2.read uncommitted(读取未提交的数据)

多个事务中,可以读取到其他事务还未commit的数据,是所有隔离级别中最低的一种。比如 a= 1000, 事务A:update t set a = a + 200; 事务B,select a from t ,那么事务B结果为1200

有什么问题?

1. 脏读,读取到还未改变的数据,侧重点在其他事务未提交

2. 不可重复读,在一个事务中,重复相同的查询,有可能得到两次不同的结果。不可重复读侧重点在于更新修改数据,在一个事务中,查询相同范围的数据,同一个资源数据莫名被修改了

3. 幻读,表象和不可重复读差不多,都是一个事务得到不同的结果。要区分的话,幻读的侧重点在于新增和删除。在一个事务,相同的范围查询中,莫名多了或少了一些数据。必要条件有两个:1.insert/delete操作 2.范围查询

侧重于读写,在插入(写)事先检测(读)不存在的数据时,惊奇的发现数据已经存在了,之前检测读的结果如幻想一样。第一次select是读取,第二次的 insert 其实也属于隐式的读取,(插入时要先读取一下数据是否存在)

3.read committed(读取已提交的数据)

大多数数据库默认的级别。

只可以读到其他事务提交的数据。

有什么问题?

1. *不可重复读*

2. 幻读

4.repeatable read(可重复读)——Mysql的默认隔离级别

当前的事务可以重复读,同一个查询,每次查询的结果都相同,而不管其他事务有没有提交。

有什么问题?

1. 幻读,在一个范围查询中,其他事务进行了insert或delete操作,两次查询前后结果不一致

默认mysql的rr级别是行级锁,只会对作用行加锁,因此可以新增和删除,所以幻读的情况时针对insert和delete操作

Mysql InnoDB 的RR级别会对范围加上GAP锁,理论上不会存在幻读,这个加锁度使用的机制是next-key locks.

5.serializable(串行化)

所有事务的写操作都会串行执行,这是隔离级别中最严格的,会对性能造成影响

你可能感兴趣的:(Mysql事务隔离级别)