Mysql

作者: 阿懒土灵 | 来源:发表于2018-08-10 16:27 被阅读15次

    MySQL InnoDB中使用悲观锁

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

    //0.开始事务
    begin;/begin work;/start transaction; (三者选一就可以)
    //1.查询出商品信息
    select status from t_goods where id=1 for update;
    //2.根据商品信息生成订单
    insert into t_orders (id,goods_id) values (null,1);
    //3.修改商品status为2
    update t_goods set status=2;
    //4.提交事务
    commit;/commit work;
    

    使用select…for update会把数据给锁住,不过我们需要注意一些锁的级别,MySQL InnoDB默认行级锁。行级锁都是基于索引的,如果一条SQL语句用不到索引
    是不会使用行级锁的,会使用表级锁把整张表锁住,这点需要注意。

    乐观锁

    乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

    相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。

    更改查询

    Mysql当使用 update select操作,从数据库中先查询出数据再更改数据,会提示报错信息:

    You can't specify target table ...
    

    主要是因为mysql不支持,需要再增加一个select作为查询出的镜像结果再进行更改操作。

    查一张表的结果去更改另一张表

    update table1 inner join select table2 set 操作:
    语法

    UPDATE table_1 a INNER JOIN (SELECT id, name FROM table_2) b 
    ON a.id = b.id SET a.name = b.name  
    

    Mybatis中#{}和${}的区别

    前者会将传入的字符串加上引号再装配sql语句,后者则是直接使用传入的字符串,在传入表名的时候使用后者。前者可以防止sql注入。

    相关文章

      网友评论

          本文标题:Mysql

          本文链接:https://www.haomeiwen.com/subject/zkhlbftx.html