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)
排他锁又称写锁, 跟共享锁的区别是, 其他线程既不能读也不能写数据
来源: http://www.jianshu.com/p/ddfa9cd5f605