说明:以下内容仅仅针对innordb引擎,其他的不一定通用 1、并发中可能存在的问题 (1)读读 不会有问题 (2)读写 有脏读、不可重复读、幻读的问题 (3)写写 有写丢失的问题 2、事务的4个特性 ACID 原子性、一致性、隔离性、持久性 3、解决问题的方案 (1)写写问题 只是理论上存在,可以由排他锁解决,update默认有排他锁,无法设置不加锁,所以这个问题在innordb中不存在 (2)读写问题 脏读问题、不可重复读问题,由mvcc解决。 幻读问题,由串行化或者间隙锁解决。 3、事务的隔离级别(读写中的问题和解决) (1)读未未提交,存在脏读、不可重复读、幻读的全部问题 (2)读已提交,解决脏读问题,有不可重复读、幻读的问题 (3)可重复读,解决脏读和不可重复读的问题,有幻读的问题 (4)串行化,问题全部解决 5、锁 (1)、从加锁的范围上,分为行锁(记录锁)、表锁(意向锁) (2)、从加锁的排斥上,分为共享锁(S锁)和排他锁(X锁) (3)、乐观锁和悲观锁,mysql中涉及的锁都是悲观锁,不提供乐观锁。但很多人误认为mvcc是乐观锁,其实这是一种无锁实现 (4)、间隙锁(gap lock) 间隙锁 是 Innodb 在 RR(可重复读) 隔离级别 下为了解决幻读问题时引入的锁机制。间隙锁是innodb中行锁的一种。 (5)、临建锁(next-key lock) 是记录锁和间隙锁的组合,它指的是加在某条记录以及这条记录前面间隙上的锁。也可以理解为一种特殊的间隙锁。通过临建锁可以解决幻读的问题。 每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。需要强调的一点是,InnoDB 中行级锁是基于索引实现的,临键锁只与非唯一索引列有关,在唯一索引列(包括主键列)上不存在临键锁。 6、默认锁 (1)select 默认不加任何锁 如果显式加共享锁: select .... lock in share mode select .... for update (2)update默认加排他锁 7、默认事务隔离级别 可重复读 8、innerdb设置每个事务隔离级别锁对应的方案 (1)读未提交,系统不采取任务策略 (2)读已提交和不可重复读,系统采用mvcc (3)幻读,使用串行化或者间隙锁解决 9、幻读问题的解决 (1)设置为串行化隔离级别(系统设置层面解决),代价太大,一般不采用 (2)间隙锁解决(手动解决,编写sql语句时解决) 实例: 在查询的一个区间内用for update select * from user where user_id > 100 for update;
标签:innordb,幻读,间隙,update,基础知识,问题,并发,解决,重复 From: https://www.cnblogs.com/tcwyh/p/16819419.html