redis设计与实现 书中说:
Redis的事务总是具有ACID中的原子性、一致性和隔离性,当服务器运行在AOF
持久化模式下,并且appendfsync选项的值为always时,事务也具有耐久性。
可看网上资料,又说redis事务不满足原子性和持久性:
在redis事务中如果有某一条命令执行失败,其后的命令仍然会被继续执行,并不会自动回滚;
在AOF的“总是 SYNC ”模式下,事务的每条命令在执行成功之后,都会立即调用fsync或fdatasync将事务数据写入到AOF文件。
但是,这种保存是由后台线程进行的,主线程不会阻塞直到保存成功,所以从命令执行成功到数据保存到硬盘之间,还是有一段非常小的间隔,所以这种模式下的事务也是不持久的。
求解答~~
迷茫2017-04-24 09:14:18
이것은 주로 Redis의 원자성에 대한 의구심 때문입니다. 이제 Redis가 트랜잭션에서 명령 실행이 실패하면 롤백되지 않는 것으로 확인되었습니다.
명령이 실패하더라도 대기열에 있는 다른 모든 명령은 처리된다는 점에 유의하는 것이 중요합니다. Redis는 명령 처리를 중지하지 않습니다.
PHPz2017-04-24 09:14:18
우선 Redis는 단일 스레드이므로 mutil을 사용하여 일련의 명령을 수동으로 캡슐화하여 전체적으로 실행하지 않는 한 트랜잭션 개념이 없습니다. 롤백됩니까? 직접 테스트해 볼 수 있습니다.
단일 스레드이므로 각 명령은 원자적입니다. Redis 트랜잭션은 명령 그룹을 함께 캡슐화하여 실행되므로 명령 실행과 관련하여 다른 명령을 차단하므로 격리됩니다. 일관성, 위에서 수행한 테스트가 롤백되면 일관성이 없는 것입니다.