zoukankan      html  css  js  c++  java
  • mysql中 for update 使用

    for update是在数据库中上锁用的,可以为数据库中的行上一个排它锁。当一个事务的操作未完成时候,其他事务可以读取但是不能写入或更新。

    例子:
    比如一张表三个字段 , id(商品id), name(商品名字) , count(数量)
    当商品抢购时候会显示剩余商品件数,如果并发量大的时候,商品自减的值可能不准确。所以当我们在一个事务中对count字段进行修改的时候,其他事务应该只能读取指定id的count,而不能进行update等操作。这个时候就需要用到for update.

    sql语句:
    start transaction ;
    select * from table_name where id =1 for update ;

    update table_name set count = count - 1 where id= 1;

    此时如果另一个事务也想执行类似的操作:
    start transaction ;
    select * from table_name where id =1 for update ;
    //下面的这行sql会等待,直到上面的事务回滚或者commit才得到执行。
    update table_name set count = count - 1 where id= 1;

    *注:当选中某一个行的时候,如果是通过主键id选中的。那么这个时候是行级锁。
    其他的行还是可以直接insert 或者update的。如果是通过其他的方式选中行,或者选中的条件不明确包含主键。这个时候会锁表。其他的事务对该表的任意一行记录都无法进行插入或者更新操作。只能读取。*
     

    那是一种行级锁,一旦用户对某个行施加了行级加锁,则该用户可以查询也可以更新被加锁的数据行,其它用户只能查询但不能更新被加锁的数据行.如果其它用户想更新该表中的数据行,则也必须对该表施加行级锁.即使多个用户对一个表均使用了共享更新,但也不允许两个事务同时对一个表进行更新,真正对表进行更新时,是以独占方式锁表,一直到提交或复原该事务为止。行锁永远是独占方式锁。
    只有当出现如下之一的条件,便释放共享更新锁:
    (1)、执行提交(COMMIT)语句;
    (2)、退出数据库(LOG OFF)

    (3)、程序停止运行。

     

    那么,什么时候需要使用for update?就是那些需要业务层面数据独占时,可以考虑使用for update。场景上,比如火车票订票,在屏幕上显示邮票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。所以,在这个确认过程中,可以使用for update。这是统一的解决方案方案问题,需要前期有所准备
    ————————————————
    版权声明:本文为CSDN博主「飞起的人生」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_35349114/article/details/84027745

  • 相关阅读:
    如何在当前文件夹打开cmd(基于win10)
    Python命名空间和作用域
    Python定位模块_PYTHONPATH变量
    Python模块_import语句_from...import 函数名_from ... import *
    Python全局变量和局部变量
    Python变量作用域
    Python匿名函数_return语句
    Python函数参数
    Python按值传递参数和按引用传递参数
    Python函数调用
  • 原文地址:https://www.cnblogs.com/gao88/p/12502593.html
Copyright © 2011-2022 走看看