- 主题:如何保证查询删除插入的原子性
比如一个接口,先查询数据库有没有记录,有就删除,再插入记录
怎么保证原子性
--
FROM 119.139.198.*
transaction听说过没
--
FROM 114.240.244.*
1、mybatis sqlsession 报告 @tranactional 注解不支持
2、删除,查询,插入,两个同时调用这个接口的时候,有一个接口会抛异常,因为主键
冲突。
A B
查询
删除
查询
插入
插入
这样的时序
当然可以把这个方法用sychronized修饰一下
但是可能其他方法也有这样的操作
【 在 z16166 的大作中提到: 】
: transaction听说过没
--
FROM 119.139.198.*
典型的事务问题
启用事务就行了,如果搞不定,查查事务的隔离级别
【 在 iwannabe 的大作中提到: 】
: 比如一个接口,先查询数据库有没有记录,有就删除,再插入记录
: 怎么保证原子性
--
FROM 124.64.23.*
最简单就是用数据库的事务。mysql默认是不支持事务的,需要改一下存储引擎
还可以用REPLACE,相当于DELETE + INSERT,但是原子的
【 在 iwannabe 的大作中提到: 】
: 比如一个接口,先查询数据库有没有记录,有就删除,再插入记录
: 怎么保证原子性
--
FROM 124.126.0.*
乐观锁或者分布式锁
--
FROM 122.235.192.*
CAS
每次操作记录一次操作id,比如用系统时间等
先select的时候记住上次的操作id
然后update的时候where把上次操作id作为条件,如果匹配就修改,然后根据modified count判断是否修改成功。如果不成功,就重新select再次修改
--
FROM 114.251.196.*
mysql的话,用replace into
【 在 iwannabe 的大作中提到: 】
: 比如一个接口,先查询数据库有没有记录,有就删除,再插入记录
: 怎么保证原子性
--
FROM 114.241.91.*
我用过的方法
加个redis锁,确保每次只有一个'在操作
还有insert on duplicate update
- 来自 水木社区APP v3.5.7
【 在 iwannabe 的大作中提到: 】
: 1、mybatis sqlsession 报告 @tranactional 注解不支持
: 2、删除,查询,插入,两个同时调用这个接口的时候,有一个接口会抛异常,因为主键
: 冲突。
:
: A B
: 查询
: 删除
: 查询
: 插入
: 插入
:
: 这样的时序
:
: 当然可以把这个方法用sychronized修饰一下
:
: 但是可能其他方法也有这样的操作
--
FROM 223.104.39.*