redis 事务、python代码实现redis事务

redis 事务、python代码实现redis事务,第1张

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()

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/883665.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-14
下一篇 2022-05-14

发表评论

登录后才能评论

评论列表(0条)

保存