您的位置:首页 > 数据库 > SQL

MySQL架构之并发控制

2018-03-20 08:28 211 查看

一、为什么需要并发控制

    为什么需要并发控制,举个很现实的例子,现数据库中有一张A表,路人甲在读取A表中的一条数据,路人乙恰巧在同一个时刻在对这条数据进行更改(最坏的场景就是删除了),那么这个时候,路人甲那边可能会报错退出,或者是读取不到真实的数据。那么解决这类问题最好的途径就是并发控制了,下面讲一下如何实现并发控制。

二、并发控制的实现

2.1读写锁

    在处理并发控制时其实很简单,可以通过实现一个由两种类型的锁组成的锁系统来解决问题,这个两种类型的锁通常被称为共享锁和排他锁,也叫读锁和写锁。

    读锁是共享的,或者说是相互不阻塞的,多个客户在同一个时刻可以同时读取同一个资源,而互不干扰。写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出去安全策略的考虑,只有这样,才能确保在同一时刻中,只有一个用户在写入,并防止其他用户读取正在写入的同一资源

2.2锁粒度

    一种提高共享资源并发性的方式就是让锁定对象更有选择性,尽量只锁定需要修改的部分数据,而不是所有资源,问题是加锁也需要消耗资源,锁的各种操作,包括获得锁,检查锁是否已解除、释放等,都会增加系统的开销,如果系统会费大量的时间来管理锁,而不是存取数据,那么系统的性能就会因此受到影响。

    此时所策略应运而生,所谓锁策略,就是在锁的开销和数据的安全性之间寻求平衡,这种平衡当然也会影响性能,大多数商业数据库系统没有提供更多的选择,一般都是行级锁,并以更加复杂的方式来实现,以便在锁比较多的情况下尽可能地提供更好的性能。

    而MySQL确提供了更好的选择,每种MySQL的存储引擎都可以实现自己的锁策略和锁粒度。下面介绍下MySQL中比较重要的两种锁策略。

2.3MySQL比较重要的两种锁策略

表锁    表锁是MySQL中最基本的锁策略,并且是开销最小的策略。它会锁定整张表,一个用户在进行写操作前,会获得写锁,这会阻塞其他用户对该表的所有读写操作。

    另外,写锁是比读锁更有优先级的,也就是在锁队列中,写锁可以插入到读锁前面,反之读锁是不能插入到写锁前面的。

行级锁    行级锁可以最大程度地支持并发管理,同时也带来了最大的开销。在我们常用的InnoDB和XtraDB中,实现了行级锁。即只会锁定一行的数据,同样,写锁是比读锁更有优先级。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: