zoukankan      html  css  js  c++  java
  • for update 锁行和锁表

    【钱包扣钱】事务中:

    //事务
    SELECT balance FROM 'account' WHERE id = 1 FROM UPDATE
    //判断钱包是否大于需要扣除的金额,例如100
    UPDATE 'account' SET balance = balance - 100 WHERE id =1 
    //提交事务

    在未提交事务之前,其他人使用for update语句查询这个时候会出现被锁住,无法被读取。保证准确性

    SELECT ... FOR UPDATE 的Row Lock 与Table Lock

    只有「明确」的指定主键,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住)。

    示例:

    表account 其中主键为id

    SELECT * FROM 'account' WHERE id='3' FOR UPDATE;

     有主键,并且有此数据,row lock

    SELECT * FROM 'account' WHERE id='-1' FOR UPDATE;

     主键,若查无此数据,无lock

    SELECT * FROM 'account' WHERE name='小树' FOR UPDATE;

     无主键,table lock

    SELECT * FROM 'account' WHERE id<>'3' FOR UPDATE;
    SELECT * FROM 'account' WHERE id>'3' FOR UPDATE;
    SELECT * FROM 'account' WHERE id LIKE '3' FOR UPDATE;

    主键不明确,table lock

  • 相关阅读:
    2019-8-31-C#-性能分析-反射-VS-配置文件-VS-预编译
    2018-8-10-WPF-鼠标移动到列表上-显示列表图标
    C语言对齐、补齐
    main函数前后
    Ubuntu安装telnet
    Ubuntu安装rpm
    extern c 解释
    gcc和g++编译器
    原子操作
    linux内核信号量
  • 原文地址:https://www.cnblogs.com/muxueyuan/p/13262396.html
Copyright © 2011-2022 走看看