背景
在我们对数据库进行操作的时候,可能由于insert的时候多操作一个就回产生多一条一样的数据,或者在进行update的时候,老数据覆盖了新数据,那么我们应该如何避免重复或者误更新呢
分析
重复数据
- 悲观锁
在insert前先select for update将表锁住,没有就insert有就update - 唯一索引
给主要的业务字段(比如:订单号)加上唯一索引 - 防重表
将多字段形成唯一表,插入数据,成功就insert否则步操作或者update - 分布式锁
使用redis或者zk等分布式锁,操作成功就insert否则步操作或者update - token
token只能使用一次,其他操作均失败
误更新
- 乐观锁
在表重定义version,在使用id+version更新,如果结果返回1说明更新成功,将version +1,否则更新失败