zoukankan      html  css  js  c++  java
  • MySQL数据库同步之悲观锁和乐观锁

    测试需要:本地开两个测试窗口

    悲观锁

    悲观锁它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。 
    一个典型的倚赖数据库的悲观锁调用: 
    select * from table where name='who am i' for update;
    这条 sql 语句锁定了table表中所有符合检索条件( name='who am i' )的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。 Hibernate 的悲观锁,也是基于数据库的锁机制实现。

    一个窗口开启一个事务但是不提交事务,执行select语句其中包含for update子语句。需要注意的是for update要放到mysql的事务中,即begin和commit中,否则不起作用。

    另一窗口尝试更新表

    我们可以看到报错了内容是:锁等待超时超过;试着重新启动事务

     这个时候我们提交事务

     再次尝试更新时更新成功了

     优点与不足

    悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;另外,在只读型事务处理中由于不会产生冲突,也没必要使用锁,这样做只能增加系统负载;还有会降低了并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数

     乐观锁

    参考http://chenzhou123520.iteye.com/blog/1863407

  • 相关阅读:
    【转】 VC MFC 钩子 实现 自绘 窗体 标题栏 非客户区
    Scintilla开源库使用指南(二)
    Scintilla开源库使用指南(一)
    【转】MFC 多文档
    多视图识别
    获得MFC窗口其它类指针的方法
    sql2005 查看数据库或表大小的系统存储过程 sp_spaceused
    哪里是乐土?关于团队良性循环 (转)
    项目管理反思——前言
    项目经理思考——团队
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/7488460.html
Copyright © 2011-2022 走看看