怎样解决高并发下的数据重复修改

在两个请求都是同时对同一个表的字段操作时,update同时操作,由于两个请求处理的数据库内数据都是一样的,如果两个请求处理的结果都是不一样的,那么真实数据库内数据会保存最后一次的数据,从而使一次请求失去效果,造成数据库脏数据。

解决

  1. 利用update行锁,先update再select,检查结果合法性,成功comment,失败rollback
  2. 利用乐观锁,获取待修改数据,update时添加修改条件,保证只有一个修改成功
  3. 利用悲观锁,先添加行锁,把待更新数据锁住,其他操作无法获取或更新该数据,成功后解锁
  4. 利用redis存储一致性字段,redis的inci和decr具有原子性
  5. 利用redis做分布式锁,对应的还有线程锁、进程锁,针对资源使用,先加锁,然后操作,最后解锁

锁要求

  1. 互斥性:单一资源同时只能有一个客户端获得锁操作
  2. 安全性:只能由持锁客户端可解锁
  3. 死锁:获得锁由于某种原因未释放锁,其他客户端无法获取锁
  4. 容错:死锁下,仍然可获取锁

Copyright © 2020 Powered by agaege.com