数据幂等性是指相同的操作在不同时间执行多次所产生的结果是一样的,它是保证操作的可靠性和正确性的重要标准。
使用幂等性是必要的,因为同一操作经常会被重复执行。当多次执行相同的操作时,如果没有幂等性,会产生不可预料的结果。例如在数据库中插入一条记录时,如果没有使用幂等性,可能会导致多条相同的记录被插入。
以下是一些幂等性保障方案:
1、MySQL唯一索引或主键 INSERT IGNORE
示例:INSERT IGNORE INTO table (col1, col2) VALUES (val1, val2);
INSERT IGNORE语句会在插入数据时忽略重复值,如果已存在则返回0。不会抛出任何错误。
该方法能够保障数据库插入操作时的幂等性。
2、MySQL唯一索引或主键 ON DUPLICATE KEY
2.1 示例:INSERT INTO table (col1, col2) VALUES (val1, val2) ON DUPLICATE KEY UPDATE col1 = val1;
ON DUPLICATE KEY UPDATE语句。当插入重复数据时,会将原有的数据进行更新,更新的列由SET子句指定。
2.2 示例:CREATE TABLE table (id INT PRIMARY KEY, col1 VARCHAR(255)) ENGINE=InnoDB;
INSERT INTO table (id, col1) VALUES (1, ‘test’) ON DUPLICATE KEY UPDATE col1 = VALUES(col1);
VALUES子句获取插入的值,使得更新操作与插入操作一样。这种方式适用于所有数据库。
该方法能够保障数据库插入操作时的幂等性。但会将记录更新为最后一次请求的字段
3、MYSQL唯一索引 INSERT
插入表时如果使用了重复字段/主键将会报错。
该方法增加了一个唯一索引,增加了表更新时所需的时间,降低了表的整体写入效率。另外,报错后在服务中需要视情况catch住相应异常,需要在代码中增加catch操作。
该方法能够保障数据库插入操作时的幂等性。
4、幂等表
在实际的写入请求之前,先插入幂等表,幂等表插入成功则可以继续执行,若插入失败则表明已做过相应操作,执行失败时应回滚幂等表。幂等表通常包含主键、类型、业务主键、状态、创建时间等,供所有业务共同使用。
插入语句的实现参考方案1、3。
该方法能够保障同一事务操作的幂等性。
5、分布式锁(悲观锁)
依赖于中间件实现的幂等性保障,需要考虑降级。
该方法能够保障同一事务操作的幂等性。
6、版本控制(乐观锁)
更新sql使用状态机作为条件范围,如果不符合状态机则更新失败。
该方法能够保障更新操作的幂等性。
7、状态机
更新sql使用状态机作为条件范围,如果不符合状态机则更新失败。
该方法能够保障更新操作的幂等性。