redis事务特性: 事务不保整原子性,有一条执行失败,其他的正常执行不保证回滚。 事务中的所有命令,都会被序列化,按顺序执行,不会被其他客户端的命令打断。 事务没有隔离级别,没有提交之前都不会被执行。 事务流程: multi 开启事务,exec执行事务。执行事务之前有命令出错了,会执行失败。discard 回滚事务。 也可以通过watch监视key的value,当执行事务时,值已经发生了变化了,和监视时不一致,会执行失败报错。
开启并执行一个事务:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key6 1
QUEUED
127.0.0.1:6379> set key7 7
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> get key6
"1"
127.0.0.1:6379> get key7
"7"
127.0.0.1:6379>
执行事务前命令不能有错误:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key3 3
QUEUED
127.0.0.1:6379> set key4
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379>
执行时有命令错误不影响其他,只是报错这一条执行失败:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key8 v
QUEUED
127.0.0.1:6379> incr key8
QUEUED
127.0.0.1:6379> set key9 9
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
127.0.0.1:6379> get key8
"v"
127.0.0.1:6379> get key9
"9"
127.0.0.1:6379>
取消事务:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key5 5
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get ker5
(nil)
127.0.0.1:6379>
watch监视key,执行事务时key的值和监视的不一样,执行事务失败。
127.0.0.1:6379> get key
"1"
127.0.0.1:6379> watch key
OK
在另一个命令行修改key的值
127.0.0.1:6379> set key 3
OK
127.0.0.1:6379> get key
"3"
执行事务失败,报错(error) ERR EXEC without MULTI,通过unwatch取消监视
127.0.0.1:6379> get key
"1"
127.0.0.1:6379> watch key
OK
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI
127.0.0.1:6379> unwatch
OK
127.0.0.1:6379>
以下是python实现一个redis事务:
import redis
import traceback
import time
conn = redis.StrictRedis()
conn.set('gold', 100)
multi = conn.pipeline()
multi.watch('gold') # 监视
multi.multi() # 开启事务
try:
multi.incr('gold', 1)
time.sleep(10) # 测试在这个时间内,把gold值改变
multi.execute() # 当gold 和 监视的不一致时,事务执行失败
except:
print(traceback.format_exc()) # redis.exceptions.WatchError: Watched variable changed.
# multi.discard() # 取消事务、监视
finally:
multi.unwatch() # 取消监视
multi.close()
conn.close()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)