首页 > 技术文章 > Redis事务

tracydzf 2020-06-24 16:05 原文

基本语法

  • MULTI
    • 开启事务, 后续的命令会被加入到同一个事务中
    • 事务中的操作会发给服务端, 但是不会立即执行, 而是放到了该事务的对应的一个队列中, 服务端返回QUEUED
  • EXEC
    • 执行EXEC后, 事务中的命令才会被执行
    • 事务中的命令出现错误时, 不会回滚也不会停止事务, 而是继续执行
  • DISCARD
    • 取消事务, 事务队列会清空, 客户端退出事务状态
$ redis-cli
127.0.0.1:6379> set user1 zs  # 设置string类型的键 user1
OK
127.0.0.1:6379> type user1  # 查看user1类型
string
127.0.0.1:6379> multi  # 开启事务
OK
127.0.0.1:6379> set age 20  # 设置string类型的键 age, 事务中的操作不会立即执行, 只是入列
QUEUED
127.0.0.1:6379> hset user1 name zs  # 设置hash类型的键 user1, 由于user1已存在, 且为string类型, 所以在该命令真正执行时会报错, 此处仅为入列
QUEUED
127.0.0.1:6379> set height 1.8  # 设置string类型的键 height
OK
127.0.0.1:6379> exec  # 提交事务, 即使部分操作失败, 不回滚且继续执行
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK

不要误导老子,这就不是事务,只是把代码堆在一起,一起执行罢了

代码示例

from redis import StrictRedis

# 创建redis客户端
redis_client = StrictRedis()

# 创建管道对象  默认会开启事务
pipe = redis_client.pipeline()

# pipe的后续操作会被放入事务中  不会立即执行
a = pipe.set('name', 'zhangsan')
b = pipe.get('name')

# 提交事务   提交才会执行事务中的命令
c = pipe.execute()

print(a)
print(b)
print(c)

注意点:

  • 创建管道后, 默认会开启事务
  • 放入事务中的命令在执行 execute方法后才会执行

推荐阅读