- 事务的三个问题
1.1 脏读: 事务A查看数据,事务B修改数据,导致事务A看到了事务B修改的脏数据,这种现象称为脏读。
1.2 不可重复读(侧重与数据行的修改):事务A查看数据,事务B修改数据并提交了事务,事务A发现数据被修改了,造成了数据的前后不一致的问题。
1.3 幻读(侧重与数据行的增加):事务A发现一张表有5条数据,事务B插入了一条数据,并提交数据,事务A发现表变成了6条数据,就像发生了幻觉一样。 - 数据库事务隔离级别分别解决了什么问题。
2.1 读未提交: 三个问题都没有解决
2.2 读提交:解决脏读。
2.3 可重复读:解决了脏读、不可重复读、幻读。
2.4 串行(加的是表锁):解决了脏读、不可重复读、幻读。 - Mysql的处理并发有什么方案。
3.1 MVCC机制,也称为多版本并发控制,这个机制完成了读写操作不冲突。在MVVC中,读操作分成了快照读和当前读
3.1.1 快照读:普通的查询语句,不需要加锁。从多个快照记录选择一条记录返回。
3.1.1.1 原理:是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(system version number)。每个写操作都会创建一个新版本,读操作从多个版本中选择一个返回(一般选择从时间戳最大的选择),解决了读写冲突的问题,
3.1.2 当前读:特殊的查询语句,例如更新,删除等操作,需要加锁。 - Mysql中有那些锁。
4.1 按使用场景来划分。
4.1.1 共享锁:共享锁时行级别的锁。共享锁之间不互斥。
4.1.2 意向共享锁:是表级别的锁,它预示着,事务有意向对表中某些行加共享锁。
4.1.3 排他锁:是行级别的锁。就是独占锁,独占锁与其他锁都互斥。
4.1.4 意向排他锁:是表级别的锁,它预示着,事务有意向对表中某些行加排他锁。
4.2 按锁的粒度划分。
4.2.1 记录锁(Record Locks): 这个锁是加在索引上的,索引查询必须命中索引才能使用这个锁。
4.2.2 间隙锁(Gap Locks):这个锁也是加载索引上的,但是它能够设置一定的范围,相当于锁定了一定范围的索引数据,也就解决了幻读的情况。
4.2.3 临键锁(Next-key Locks):临键锁,是记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间。 - Mysql是采用什么锁来解决上述数据一致问题的。
5.1 读未提交的事务隔离级别的加锁方式。
5.1.1 A事务读取记录,不加锁
5.1.2 B事务更新记录,加的是共享锁。
5.2 读提交的事务隔离级别的加锁方式。
5.2.1 A事务读取记录,加共享锁,读完马上释放共享锁。
5.2.2 B事务更新记录,加排他锁,知道事务提交,才释放锁。
5.2.3 这种方式解决了脏读,A事务看不到B事务未提交的数据。
5.3 可重复读的事务隔离级别的加锁方式。
5.3.1 A事务读取记录,加共享锁,一直到事务提交完毕了。
5.3.2 B事务更新记录,加排他锁,一致到事务提交完毕了。
5.3.3 解决了不可重复读的问题,因为在A事务读取记录时,B事务不能获取到这个记录的排他锁。其实类是与串行执行。
5.3.4 解决了幻读的问题,采用了行锁中的(GAP locks)来解决幻读的问题
mysql并发控制的机制
最新推荐文章于 2024-07-17 09:45:14 发布