MySQL-锁

摘要:
实现:向要锁定的数据添加版本ID/时间戳。具体:获取业务操作前要锁定的数据的当前版本号。更新数据时,确认版本号与上一版本号相同,并更新版本号。
1. 公平锁与非公平锁

  公平锁:严格按照线程启动的顺序执行,不允许其他线程插队执行;非公平锁允许插队;

  当使用非公平锁时,会立刻尝试配置状态,成功则:插队执行,失败则:与公平锁一样调用acquire()方法,以排他方式获取锁,成功后立刻返回,否则将线程加入队列,直到成功调用为止。

2. 悲观锁与乐观锁

  两种常见的资源并发锁设计。

  悲观锁:先获取锁,再进行业务操作。悲观:获取锁可能是失败的,因此需要先确保成功地获取到锁再进行业务操作。

    实现:select...for update

    具体:获取select选中的数据行的行锁,当其他并发执行选中同行时会发生排斥,实现锁的效果。当事务结束时会自动释放。

    注意:锁的条数过多时,引起服务大面积等待。

      悲观锁在多线程竞争的条件下,加锁和释放锁会导致比较大的上下文切换和调度延时,引起性能问题;

      优先级高的线程等待优先级低的线程释放锁会导致优先级倒置,引起性能风险;

      其他线程挂起;

  乐观锁:先进行业务操作,再获取锁。乐观:获取锁大概率是成功的,因此在进行完业务操作实际更新数据时再拿锁。

    实现:需要锁的数据上增加版本标识/时间戳

    具体:在业务操作进行前获取需要锁的数据的当前版本号,实际更新数据时确认版本号与之前的相同,并更新版本号。如果更新失败,认为旧数据被并发修改后不存在了,认为获取锁失败,需要回滚整个业务操作并看情况重试。

  比较:乐观锁获取锁成功时开销小,但回滚时开销大;适用于取锁失败率小的场景;      

  推荐:乐观锁 + 重试  

   

免责声明:文章转载自《MySQL-锁》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows App开发之应用布局与基本导航UNDO空间满的处理方法(含UNDO的学习与相关解释)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

二进制日志备份与恢复,快照备份,复制

二进制日志备份与恢复 二进制日志非常关键,我们可以通过它来完成point-in-time的恢复工作。MySQL数据库的复制同样需要二进制日志。默认情况下并不启用二进制日志,要使用二进制日志,首先必须启用它,在配置文件中进行如下设置: [mysqld] log-bin 对于InnoDB存储引擎只是简单启用二进制日志是不够的,还需要启用一些其他参数来保证安全和...

到底是什么原因导致我的进程崩溃?

当你你有1000个w3wp.exe文件在eventviewer中意外停止,或者您的进程以某种奇怪的未定义方式退出,您不知道原因。当一个进程崩溃或退出时,将触发一个称为EPR(Exit process)的特殊事件,因此使用类似于windbg.exe文件我们可以附加到进程中,等待epr被抛出,然后进行内存转储。安装windows调试工具时,会得到一个名为adp...

winform知识

控件相关 1.文本框/label高度 文本框Multiline属性,设为true就可以了。改完高度后再将此属性改回来,要不然多行文本框,按回去就去下一行了。 label的改autoSize属性,设为false就可以了。 2.控件中文字居中 TextAlign属性:MiddleCenter 3.颜色属性 直接输入 #xxxx 4.如何去掉button按钮的...

多核时代,还在使用任务管理器来看程序的性能吗?

是否为了一个程序只占用了13%的CPU利用率而沾沾自喜呢? 别忘了现在是多核时代,四核,超线程的i7. 单个线程最多只能占到12.5%的CPU利用率。 忘记这个简单的CPU利用率吧,多核时代,你需要具体知道到每个线程的利用率。 这篇博客,来源一个刚刚遇到的问题。 背景是我们正在针对Windows Media Player开发一些东西,具体是什么不重要。...

Linux性能监控、调优(CPU篇)

前言: 网上其实有很多关于这方面的文章,那为什么还会有此篇呢,有这么几个原因,是我翻译的动力,第一,概念和内容虽然老套,但都讲得很透彻,而且还很全面.第二,理论结合实际,其中案例分析都不错.第三,不花哨,采用的工具及命令都是最基本的,有助于实际操作.但本人才疏学浅,译文大多数都是立足于自己对原文的理解,大家也可以自己去OSCAN上找原文,如果有什么较大出入...

SQL Server 2008新特性——更改跟踪

在大型的数据库应用中,经常会遇到部分数据的脱机和多个数据库的合并问题。比如现在有一个全省范围使用的应用程序,每个市都部署了单独的相同的应用程序服务器和数据库服务器,每个月需要将全省所有市的数据全部汇总起来用于出全省的报表,这是一种很常见的数据库合并问题。再比如我们做了一个SmartClient的应用程序,每个客户端都有应用程序和数据库,另外还有一个中心数据...