zoukankan      html  css  js  c++  java
  • 悲观锁和乐观锁

    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.并发访问数据库人数

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

  • 相关阅读:
    浏览器的同源策略及跨域解决方案
    前端开发工具系列
    初始Vue
    form表单组件
    聚合和分组F,Q和事物,cookie,session
    js循环找id
    div模拟textarea文本域轻松实现高度自适应
    prototype原型
    Javascript异步编程方法
    js中map、filter用法
  • 原文地址:https://www.cnblogs.com/zhihuayun/p/7239429.html
Copyright © 2011-2022 走看看