zoukankan      html  css  js  c++  java
  • 数据库--悲观锁

    悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

    使用场景举例:以MySQL InnoDB为例

    商品goods表中有一个字段status,status为1代表商品未被下单,status为2代表商品已经被下单,那么我们对某个商品下单时必须确保该商品status为1。假设商品的id为1。

    1如果不采用锁,那么操作方法如下:

    //1.查询出商品信息

    select status from t_goods where id=1;

    //2.根据商品信息生成订单

    insert into t_orders (id,goods_id) values (null,1);

    //3.修改商品status为2

    update t_goods set status=2;

    上面这种场景在高并发访问的情况下很可能会出现问题。

    前面已经提到,只有当goods status为1时才能对该商品下单,上面第一步操作中,查询出来的商品status为1。但是当我们执行第三步Update操作的时候,有可能出现其他人先一步对商品下单把goods status修改为2了,但是我们并不知道数据已经被修改了,这样就可能造成同一个商品被下单2次,使得数据不一致。所以说这种方式是不安全的。

    2使用悲观锁来实现:

    在上面的场景中,商品信息从查询出来到修改,中间有一个处理订单的过程,使用悲观锁的原理就是,当我们在查询出goods信息后就把当前的数据锁定,直到我们修改完毕后再解锁。那么在这个过程中,因为goods被锁定了,就不会出现有第三者来对其进行修改了。

    注:要使用悲观锁,我们必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。

  • 相关阅读:
    MVC3分页
    ASP.NET MVC导入excel到数据库,下载文件
    使用JS获取客户端MAC地址
    关于mschart控件在mvc项目中的webform里面显示不出图片的问题
    difference between "on" and "where" when using left/right join query
    Will static methods over multithreading cause threadsafe problem?
    const VS readonly in detail
    一个编码引发js错误的问题
    分享一个基于FileSystemWatcher的文件自动备份程序
    Back/Forward and Refresh in browser
  • 原文地址:https://www.cnblogs.com/cww0814/p/7805936.html
Copyright © 2011-2022 走看看