Redis Multi Обеспечение атомарности - PullRequest
0 голосов
/ 10 августа 2011

Есть ли способ в redis сделать все команды в «многопользовательской» транзакции неудачной, если одна из команд завершится неудачно.

например.

<?php
//using phpredis
//connection made

$redis->set('c', 1);
$res = $redis->multi()
      ->get( 'b' )
      ->get( 'c' )
      ->exec();
?>

$ res будет содержать 1, ложь.Есть ли способ в redis сделать так, чтобы $ res вернул false и транзакция завершилась неудачно в случае сбоя одной из команд?

Ответы [ 4 ]

2 голосов
/ 10 августа 2011

Из документации redis по транзакциям :

Важно отметить, что даже в случае сбоя команды все остальные команды в очереди обрабатываются - Redis не останавливаетобработка команд.

Согласно этой статье кажется, что транзакции redis покрывают семантику ACID только частично и эквивалента отката нет, хотя discard commmandиспользоваться для отмены транзакции.

1 голос
/ 10 марта 2013

Вы не можете откатить транзакции Redis http://openmymind.net/You-Cant-Rollback-Redis-Transaction/

1 голос
/ 14 августа 2011

В чем реальная разница между откатом и сбросом?Например, в SQL Server внутри транзакции я проверяю ошибки в каждом операторе, а затем условно прерываю транзакцию.

Здесь вы можете использовать ERR ответ Redis, который, например, phpredis правильно обрабатываеткак условие ошибки.

Следующий код обнаруживает ошибку ZADD, например.

$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$redis->multi();
$redis->set('ch1',1978); //good command
$f = $redis->zadd('ch2',1231); //this will fail
if (!$f) {
    $redis->discard();
    echo "Transaction aborted";
}
else {
    $redis->exec();
    echo "Transaction committed";
}
0 голосов
/ 01 декабря 2017

Нет отката, потому что для Redis это не имеет особого смысла. Издержки, которые это принесло бы, были бы слишком непропорциональными.

Вероятность сбоя операции Redis слишком мала. Из официального документа:

Ошибки внутри транзакции

Во время транзакции можно встретить два вида командных ошибок: Команде не удается поставить в очередь, поэтому перед вызовом EXEC может возникнуть ошибка.

Например, команда может быть синтаксически неправильной (неправильное количество аргументов, неправильное имя команды, ...), или может быть какое-то критическое состояние, такое как нехватка памяти (если сервер настроен на ограничение памяти) используя директиву maxmemory).

Команда может завершиться ошибкой после вызова EXEC, например, поскольку мы выполнили операцию с ключом с неправильным значением (например, вызовом операции со списком для строкового значения).

Подобные ошибки можно предотвратить, и их можно обнаружить при разработке.

Подробнее об этом можно прочитать здесь: https://redis.io/topics/transactions

...