企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
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 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。