찾다

 >  Q&A  >  본문

Predis는 트랜잭션을 사용하여 두 개의 명령을 실행하지만 그 중 하나가 실패합니다.

설명 오류

Redis 목록을 사용하여 리미터를 만들고 있는데 대부분 예상대로 작동하지만 최근에 만료 시간이 없는 일부 키가 있다는 것을 발견했습니다. 이상적으로는 값을 목록에 "rpush"하고 트랜잭션의 만료 시간을 설정하고 트랜잭션이 시작되기 전에 "watch"도 사용합니다.

다시 나타나기

jmeter를 사용하여 1초에 500개 요청과 같은 관련 API를 일괄 요청해도 이 버그는 내 로컬 환경에서 재현되지 않습니다

버전:

예측: v2.1.2 PHP 7.4 Redis 서버 5.0.10

코드 예시

으아악

기타

이것은 내 로컬 Redis 서버에서 예상되는 작업입니다

Redis 트랜잭션은 원자적입니다. 원자성은 모든 명령이 처리되거나 명령이 처리되지 않음을 의미합니다. 따라서 내 경우에는 키에 만료 날짜가 있어야 합니다.

P粉030479054P粉030479054445일 전662

모든 응답(1)나는 대답할 것이다

  • P粉113938880

    P粉1139388802023-09-14 11:49:51

    Redis 트랜잭션은 원자 트랜잭션이 아닙니다. 명령의 트랜잭션이 실행되는 동안 다른 프로세스가 키 공간에 액세스할 수 없기 때문에 원자적입니다. 트랜잭션 내의 명령이 실패하면 후속 명령이 실행되고 롤백되지 않습니다.

    예를 들어 잘못된 명령이 포함된 트랜잭션을 실행해 보겠습니다.

    으아아아

    여기서 목록이 존재하는지 확인하고 목록에 몇 가지 초기 항목을 추가합니다. 그런 다음 트랜잭션 내에서 목록에서 항목을 꺼내고 실수로 키를 생각하여 새 항목을 추가하려고 합니다. mylist 拥有一个集合,然后设置键 mylist< 上的生存时间/代码>。第一个和第三个命令成功,最后,mylist 设置了生存时间。第二个命令失败。为此,Redis 中没有内置回滚功能 - 您的应用程序需要通过 watch 명령은 낙관적 잠금을 사용합니다... 이는 트랜잭션이 트랜잭션이 원하는 것을 얻기 전에 다른 프로세스의 변경 사항을 감지하는 것입니다. 변경된 키 서버에 독점적으로 접근할 수 있습니다. 롤백 메커니즘이 아닙니다.

    세부정보: https://redis.io/docs/interact/transactions/

    회신하다
    0
  • 취소회신하다