1. 行锁
给某一行记录上锁,目前只有InnoDB引擎支持行锁
2. 表锁
给一个整张表上锁
3. 乐观锁
本身很乐观,认为在操作数据时(更新操作),默认别的线程并不会操作数据发生冲突,所以在每次操作时并不会上锁,只是在更新时判断别的线程在此期间是否有做修改,如果有修改该操作就无效
通常实现是这样的:在表中的数据进行操作时(更新),先给数据行加一个版本(version)字段,每操作一次,将那条记录的版本号加1。也就是先查询出那条记录,获取出version字段,如果要对那条记录进行操作(更新),则先判断此刻version的值是否与刚刚查询出来时的version的值相等,如果相等,则说明这段期间,没有其他程序对其进行操作,则可以执行更新,将version字段的值加1;如果更新时发现此刻的version值与刚刚获取出来的version的值不相等,则说明这段期间已经有其他程序对其进行操作了,则不进行更新操作。
~~~
#1.查询出商品信息
select (status,status,version) from t_goods where id=#{id}
#2.修改商品status为2
set status=2,version=version+1 where id=#{id} and version=#{version};
~~~
4. 悲观锁
(大多数情况下依靠数据库的锁机制实现,开销比较大)
本身很悲观,认为在操作数据时总会发生冲突,所以在每次操作时都需要给相应的数据加上锁来避免冲突,所以悲观锁比较耗时,另外与乐观锁不同悲观锁是由数据库自己实现的,所以要用的时候可以直接调用数据库的相关语句.
共享锁和排他锁是悲观锁的不同实现,但都属于悲观锁
* 共享锁(lock in share mode)
共享锁又称读锁,一个线程给数据加上共享锁之后,其他线程只能读数据不能修改数据
* 排他锁(for update)
排他锁又称写锁,跟共享锁的区别是,其他线程既不能读也不能写数据
作者:小新是个程序媛
链接:https://www.jianshu.com/p/ddfa9cd5f605
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 前言
- 函数参考
- Socket 函数
- socket_accept
- socket_bind
- socket_clear_error
- socket_close
- socket_connect
- socket_create_listen
- socket_create_pair
- socket_create
- socket_getpeername
- socket_getsockname
- socket_last_error
- socket_listen
- socket_read
- socket_recv
- socket_select
- socket_send
- socket_set_block
- socket_set_nonblock
- SplQueue
- 魔术方法
- 魔术常量
- 杂项
- backlog的用处
- new self()和new static()的区别
- PHP变量的生命周期
- PHP抽象类
- 对象接口
- PHP中的常用关键字
- 常量
- 内存泄露
- global 与 $GLOBAL
- 简单说明CGI和动态请求是什么
- 设计模式
- 单例模式
- 工厂模式
- 适配器模式
- 策略模式
- 观察者模式
- 控制反转IoC简介
- session
- use_trans_sid
- auto_start
- session_id
- cookie_secure
- 面试
- 数据库相关
- 语句相关
- 索引相关
- 字段相关
- PHP相关
- 字符串相关
- 函数相关
- 运算符优先级相关
- 错误相关
- redis相关
- 10个常见的Redis面试"刁难"问题
- mysql
- MySQL中的锁
- MySQL存储引擎MyISAM 和 InnoDB的区别
- MySQL半同步复制
- explain 命令详解
- 索引
- 数据库事务
- MySQL和B树的那些事
- git
- github----向开源框架提交pr的过程
- 推荐博客
- linux
- 命令
- free
- 高并发
- 抢购/秒杀功能
- 算法
- 一致性Hash算法