zoukankan      html  css  js  c++  java
  • Mysql中的读锁,写锁,乐观锁及事务隔离级别和并发问题

    mysql读锁,写锁,乐观锁

    读锁,也叫共享锁(shared lock)

    SELECT * FROM table_name  WHERE ...  LOCK IN SHARE MODE  

    写锁,也叫排他锁(exclusive lock)

    SELECT * FROM table_name WHERE ... FOR UPDATE

    乐观锁,是一种逻辑锁,通过数据的版本号(vesion)的机制来实现

    update t_goods
    set status=2,version=version+1
    where id=#{id} and version < #{version}; // 更新前将version自增

    读锁、写锁属于行级锁。即事务1 对商品A 获取写锁,和事务2 对商品B 获取写锁互相不会阻塞的。需要我们注意的是我们的SQL要合理使用索引,当我们的SQL 全表扫描的时候,行级锁会变成表锁,如果where条件中只用到主键或者唯一索引,则加的是行锁;否则加的是表锁

    lock in share mode适用于两张表存在业务关系时的一致性要求, for  update适用于操作同一张表时的一致性要求

    mqslq事务隔离级别和并发问题

    1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

    2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。

    3、幻读:系统管理员A将数据库中所有学生的成绩根据具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

    小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

    mysql默认隔离级别是可重复读

    select @@global.tx_isolation

  • 相关阅读:
    HDU 4947 GCD Array 容斥原理+树状数组
    Codeforces Round #363 (Div. 2)
    白书 博弈学习
    2016 Multi-University Training Contest 1
    KM算法 PK 最小费用最大流
    final 发布 领跑衫获奖感想
    2016"百度之星"
    爆打团队 2016.05.05 站立会议
    爆打团队 四则运算 beta视频
    爆打团队 2016.04.27 站立会议
  • 原文地址:https://www.cnblogs.com/moris5013/p/11130828.html
Copyright © 2011-2022 走看看