美文网首页
并发控制

并发控制

作者: 水岩 | 来源:发表于2019-03-18 15:11 被阅读0次

我们希望多个事务尽可能的并发执行,来提高效率。但是并发执行的事务之间相互影响会导致数据库状态不一致。

1.锁

一个很自然的方式是给事务要访问的数据加锁。锁表示当前事务对此数据元素的独占权。在事务操作数据库元素前都必须获取该元素上的锁。

读写锁

有些事务可能只是想读而不是修改某数据元素,我们有办法让这种情况更高效。读写锁也叫共享锁/排他锁。读和读兼容,读和写互斥,写和写互斥。

我们在实现读写锁时有一个当前读事务的计数,当读计数为0时才能申请到写锁。

两阶段锁

有一种叫两阶段锁的方法能够保证事务是可串行化的,即:每个事务中,所有加锁操作必须在解锁操作之前。

死锁

死锁是指多个事务竞争资源出现的阻塞现象,一般是持有A资源申请B资源与持有B资源申请A资源相互等待。

避免死锁方法:1是预防死锁发生,2是检测死锁和恢复。比较简单粗暴的方法是设定一个事务超时时间,超时以后回滚事务。

2.乐观锁

普通的锁是一种悲观锁,它们假定只要不加锁就会出错。而乐观锁假定不会出现冲突,当检测到冲突时回滚。

数据库记录读取或修改数据元素的时间戳或者版本号。在修改时验证数据在此期间是否被修改过。如果出现不一致,则重启或者取消当前事务。

如果大多数事务是只读的或者极少并发修改同一元素,则乐观锁更好。在高冲突时,悲观锁性能更好。

3 MVCC

除了通过延迟和终止事务来避免冲突以外,我们还可以通过对竞争对象进行拷贝多份来避免冲突。

多版本并发控制(MVCC)是在修改数据时,总是保持旧的版本不变而产生一个新版本的数据。读操作在多个数据元素版本中找到一个合适的版本进行读取。这样读和写不再冲突,当然写写还是冲突的。

MVCC一般要和悲观锁或乐观锁结合使用。

事务隔离级别

有时候不能完全按照可串行化的要求来执行事务,在有些应用中可以做适当的妥协来提高性能。从需求的角度讲,SQL定义了四种事务的隔离级别。

1. Read Uncommitted(读取未提交内容)

可以读到其他事务未提交的内容,可能在读取后其他事务又撤销回滚了。

2. Read Committed(读取提交内容)

一个事务只能读取到已提交事务的修改内容。当在事务执行期间另一个事务会产生提交,导致两次读取同一数据的内容不一样。

3. Repeatable Read(可重读)

事务并发执行期间,多次读取同一数据元素相同。但是会读到其他事务新增的数据。

4. Serializable(可串行化)

和每个事务顺序执行的效果相同。

上面三种解决并发问题方法的不同组合和实现细节对应不同的隔离级别。

相关文章

  • 数据库并发控制——悲观锁、乐观锁、MVCC

    三种并发控制:悲观并发控制、乐观并发控制、多版本并发控制。 悲观并发控制(又名“悲观锁”,Pessimistic ...

  • MySQL系列之三 -- -并发(MVCC)

    MySQL 并发控制如何实现 MySQL 如何实现高并发? 一 并发控制 抛开MySQL,通过技术上来讨论并发控制...

  • 乐观锁与悲观锁

    乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段 悲观并发控制(悲观锁) 它可以阻止一个...

  • iOS多线程随笔

    1. 多线程的并发控制 1.1 在CGD中快速实现多线程的并发控制 NSOperationQueue来处理并发控制...

  • 你应该了解的MySQL锁分类

    MySQL中的锁 锁是为了解决并发环境下资源竞争的手段,其中乐观并发控制,悲观并发控制和多版本并发控制是数据库并发...

  • Linux 驱动开发之并发控制

    1 设备驱动的并发控制概览 2 参考 Linux并发控制

  • MySQL多版本并发控制 - MVCC

    并发控制 实现事务隔离的机制,称之为并发控制 所谓并发控制,就是保证并发执行的事务在某一隔离级别上的正确执行的机制...

  • Dubbo剖析-并发控制

    一、前言 前面讲解了Dubbo的服务降级,本节我们来讲解dubbo中的并发控制,并发控制分为客户端并发控制和服务端...

  • 并发控制

    并发操作带来的数据不一致性有 丢失修改两个事务读入同一数据 不可重复读2次读取未用数据,前后不一致(为了检验) 读...

  • 并发控制

    并发操作带来的问题 丢失修改,事务T1和T2同时对同一个记录进行修改,会出现结果覆盖的现象 读脏数...

网友评论

      本文标题:并发控制

      本文链接:https://www.haomeiwen.com/subject/eeavmqtx.html