• Mysql锁机制


    共享锁:又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

    排他锁:又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

    mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,

    如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。

    所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,

    但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制。

    begin;
    select * from goods where id = 1 for update;
    update goods set stock = stock - 1 where id = 1;
    commit;
    

      

    表锁和行锁

    InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

    悲观锁:

         /* 更新库存(使用悲观锁)
         * @param productId
         * @return
         */
        public boolean updateStock(Long productId){
            //先锁定商品库存记录
            ProductStock product = query("SELECT * FROM tb_product_stock WHERE product_id=#{productId} FOR UPDATE", productId);
            if (product.getNumber() > 0) {
                int updateCnt = update("UPDATE tb_product_stock SET number=number-1 WHERE product_id=#{productId}", productId);
                if(updateCnt > 0){    //更新库存成功
                    return true;
                }
            }
            return false;
        }
    

      

    乐观锁:

        /**
         * 下单减库存
         * @param productId
         * @return
         */
        public boolean updateStock(Long productId){
            int updateCnt = 0;
            while (updateCnt == 0) {
                ProductStock product = query("SELECT * FROM tb_product_stock WHERE product_id=#{productId}", productId);
                if (product.getNumber() > 0) {
                    updateCnt = update("UPDATE tb_product_stock SET number=number-1 WHERE product_id=#{productId} AND number=#{number}", productId, product.getNumber());
                    if(updateCnt > 0){    //更新库存成功
                        return true;
                    }
                } else {    //卖完啦
                    return false;
                }
            }
            return false;
        }
    

      

  • 相关阅读:
    adb、monkey常用命令
    震惊!90%的程序员不知道的Java知识!
    Android,重新出发!
    Fiddler 手机抓包 手机联网异常解决方案
    技术贴汇总
    Android开发日常-listview滚动方法梳理
    JavaScript基本语法
    Spring Boot Profile
    Spring Boot配置文件占位符
    @PropertySource和@ImportSource
  • 原文地址:https://www.cnblogs.com/lnas01/p/10366915.html
Copyright © 2020-2023  润新知