• 悲观锁和乐观锁


    1.数据库并发

      当多个用户修改数据库中同一个数据时,需要对用户的访问进行并发管理,不然不会出现数据更新丢失,数据脏读等错误;比如线程A和B从数据库中读取同一数据为1,线程A先修改1为10,线程B接着又将数据修改成1,那么A的修改丢失;故需要数据库对数据加锁以实现并发管理

    2.悲观锁

      主观上认为数据一定会修改,对访问的数据加锁,在释放锁之前,其他事务都不能访问该数据,比如goods表,查询所有name=“math”的记录,select * from goods where name = “math” for update,对查询出来的记录加锁,其他悲观锁事务均不能读写这些记录,但是select * from goods where name = “math”可以读数据;悲观锁一般由数据库锁机制实现;悲观锁的锁粒度默认是基于Row-level (表的id明确的情况下),如果id不明确,则使用Tabel-level。

      注:使用悲观锁会,数据库不会默认提交更新,不能使用autocommit,开启事务,完成持久化操作后,需要手动提交事务,commint();

     3.乐观锁

      主观上认为数据不会被修改,但是在提交更新数据时会检测冲突与否,如果冲突,返回用户错误信息,让用户决定接下来怎么做;检测方法有两种:一、数据版本控制机制,就是在数据库表中添加一个version字段,每提交一次更新,version就加1。读取数据时,把version字段也读取出来,要修改数据时判断version和数据库中version大小,如果数据库中的version大,说明已经有线程修改过该记录,向用户报错。一般乐观锁用在读操作比较多的情况下 。其实乐观锁的工作原理和无阻塞算法(CAS)类似,CAS也是先获取值,然后计算值,接着判断是否有其他线程修改了值,如果没有,则自己修改值成功,否则修改值失败,CAS是原子操作

      4.并发访问数据库人数

      并发访问人数就是同一时刻和 数据库有建立连接的连接数

  • 相关阅读:
    [SDOI2013]直径(树的直径)
    [ZJOI2012]旅游(树的直径)
    [SDOI2011]消防(树的直径)
    【模板】2-SAT 问题(2-SAT)
    [HNOI2006]公路修建问题
    速度限制(分层图)
    [JLOI2011]飞行路线(分层图)
    【洛谷 P3194】 [HNOI2008]水平可见直线 (单调栈)
    【洛谷 P3187】 [HNOI2007]最小矩形覆盖 (二维凸包,旋转卡壳)
    【洛谷 P1452】 Beauty Contest (二维凸包,旋转卡壳)
  • 原文地址:https://www.cnblogs.com/zhihuayun/p/7239429.html
Copyright © 2020-2023  润新知