Alasan WATCH
tidak diekspos secara langsung adalah karena bagaimana SE.Redis dirancang untuk menggandakan perintah dari tumpukan panggilan yang berbeda pada satu koneksi. Hal ini membuat pekerjaan transaksi apa pun harus sangat dikelola dengan ketat.
Saya tidak jelas apa tujuan dari "tidak berubah" dengan sendirinya , tanpa membandingkan dengan beberapa nilai yang diketahui - jika tidak, Anda hanya membuat kondisi balapan. Sangat mungkin untuk menambahkan dukungan untuk itu, tetapi saya benar-benar ingin memahami kasus penggunaan yang diharapkan terlebih dahulu. Bisa dijelaskan?
Re edit Anda; contoh pilihan Anda (yang terakhir) tidak mungkin dengan redis - tidak ada hubungannya dengan SE.Redis; jika Anda melakukan GET
di dalam MULTI
, Anda tidak mendapatkan jawabannya sampai EXEC
selesai - jadi Anda tidak mungkin menggunakan nilai dalam SET
:belum tersedia .
Jika bukan karena multiplexing, Anda dapat mengurutkan ulang contoh kedua Anda (berdasarkan apa yang dilakukan SE.Redis) sedikit:
WATCH key
val = GET key
MULTI
val = val + 1
SET key $val
EXEC
ini adalah khas penggunaan WATCH
:kamu menonton hal-hal yang Anda tanyakan sebelumnya, maka Anda tahu bahwa {key}
tidak berubah selama loop ini (atau setidaknya, transaksi akan dibatalkan; tidak ada status yang tidak konsisten). Namun, WATCH
tidak cocok dengan multiplexer , itulah sebabnya SE.Redis memaksa Anda menyusuri rute pengambilan nilai sebelum transaksi , lalu memungkinkan Anda membandingkan nilai untuk menegaskan bahwa itu tidak berubah. Hasil yang sama; pendekatan yang sedikit berbeda, tetapi multiplexer-safe. Untuk informasi lebih lanjut tentang topik itu, lihat di sini.