Redis 事务

原创 2018年04月16日 14:56:54

什么是 Redis 事务

    Redis 事务是要保证一条或多条命令执行的原子性,即这些操作要么全部成功,要么全部失败。

Redis 事务命令和原理

命令

  • watch 监控 key
    监控 key 是否发生变化,在事务中会以 CAS 的方式判断 key 是否发生变化,如果发生了变化,会导致事务中的所有命令执行失败,但不会报错。
  • multi 开启事务
  • discard 取消事务
    取消事务并清除事务中的队列,返回 ok。如果 key 受监控,那么会取消监控,然后清除事务。
  • exec 提交事务
  • unwatch 取消监控
    取消所有 key 的监控

注意:exec 和 discard 都必须在 multi 中执行,否则报错(error) ERR EXEC without MULTI、(error) ERR DISCARD without MULTI;watch 必须在 multi 之前执行,否则报错(error) ERR WATCH inside MULTI is not allowed

原理

    将一条或多条命令序列化后放入执行队列,在提交事务之后,这些命令按顺序执行。
    如果在开启事务前,使用 watch 监控某些 key,那么提交事务之后,执行队列在执行命令时会通过 CAS 操作判断受监控的 key 是否发生了改变,如果 key 发生了变化,这个事务中的所有操作都会失败。事务执行完之后,会取消监控。

Redis 事务的分类

    事务可以分为正常事务、放弃事务、失效事务和部分成功事务。

  • 正常事务
  • 放弃事务,在事务中使用 discard 或者事务中语法错误,导致放弃事务
# 使用 discard
127.0.0.1:6380> multi
OK
127.0.0.1:6380> set lisi 1000
QUEUED
127.0.0.1:6380> set zhaoliu 1000
QUEUED
127.0.0.1:6380> discard
OK
127.0.0.1:6380> get lisi
(nil)
127.0.0.1:6380> 
# 语法错误
127.0.0.1:6380> multi
OK
127.0.0.1:6380> set lisi 1000
QUEUED
127.0.0.1:6380> cls
(error) ERR unknown command 'cls'
127.0.0.1:6380> get lisi
(nil)
127.0.0.1:6380> 
  • 失效事务,使用 watch 监控 key 时,key 发生变化后提交事务,导致事务失效
# 第一个客户端
127.0.0.1:6380> set lisi 1000
OK
127.0.0.1:6380> watch lisi
OK
127.0.0.1:6380> multi
OK
127.0.0.1:6380> set lisi 999
QUEUED
127.0.0.1:6380> exec
(nil)
# 第二个客户端,在第一个客户端执行 exec 之前修改 key 的值
127.0.0.1:6380> set lisi 888
OK
  • 部分成功事务,类型转换失败时,导致部分事务成功
127.0.0.1:6380> mset lisi 1000 wangwu 1000
OK
127.0.0.1:6380> multi
OK
127.0.0.1:6380> incrby lisi 888
QUEUED
127.0.0.1:6380> sadd wangwu iii
QUEUED
127.0.0.1:6380> exec
1) (integer) 1888
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6380> 
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30038111/article/details/79960298

一头坑进Redis之事务

一.是什么 可以一次执行多个命令,本质是一组命令的集合。
  • googleoyyp
  • googleoyyp
  • 2017-08-21 23:54:49
  • 521

redis事务的那些事情

 很多人认为redis实际没有事务,redis提供的所谓“事务”只不过是一种批处理,与数据库事务基本不是一回事情。 而事实上redis的确实现了真正意义上的ACID事务。 但是的确与传统关系...
  • qq_16414307
  • qq_16414307
  • 2016-01-08 11:11:32
  • 992

redis事务与lua

前言 事务,简单理解就是,一组动作,要么全部执行,要么就全部不执行.从而避免出现数据不一致的情况. redis提供了简单的事务功能,将一组需要的命令放到multi和exec两个命令之间.multi...
  • kwy15732621629
  • kwy15732621629
  • 2018-01-16 11:51:48
  • 202

Redis事务使用总结

Redis的事务机制允许同时执行多条指令,它是原子性操作,事务中的命令要么全部执行,要么全部不执行,另外,事务中的所有指令都会被序列化,而且其开始执行过程中,不回被即时过来的指令所打断,其需要经历三个...
  • why_2012_gogo
  • why_2012_gogo
  • 2016-04-28 15:04:56
  • 1427

Java实现redis事务

1.  正常执行的事务 @Test public void test() { Jedis jedis = new Jedis("localhost"); Tra...
  • u011734144
  • u011734144
  • 2016-06-29 14:09:52
  • 5344

Redis的事务(部分支持)

关于Redis事务一些小小的总结 一说到事务,肯定想到的是像传统关系型数据库那样,要么全部成功,要么全部失败。事务的四大特性ACID信手拈来。但这里对不起了,Redis事务可跟关系型数据库不太一...
  • hacfox
  • hacfox
  • 2017-04-06 00:59:35
  • 747

Redis中事务的使用

1.Redis与MySQL事务对比 (1)rollback与discard的区别: 如果已经成功执行了2条语句,第3条出错 rollback后,前2条语句造成的影响消失 disca...
  • huang2017
  • huang2017
  • 2017-04-16 12:50:16
  • 310

Redis入门之浅谈redis事务

redis基础之redis持久化-事务
  • candy_rainbow
  • candy_rainbow
  • 2016-10-13 22:36:31
  • 2544

跟我学Redis(17)—Redis事务详解及实例

前面有篇文章,简单介绍了Redis事务。 Redis事务主要命令包括 MULTI、EXEC、WATCH 命令。本篇文章将详细介绍事务以及Redis事务实例应用! 一、事务、悲观锁、乐观锁概述 简...
  • quasimodo_es
  • quasimodo_es
  • 2016-08-16 23:07:57
  • 3183

Redis-事务总结

Redis 事务
  • whyshr
  • whyshr
  • 2015-06-09 12:12:56
  • 1237
收藏助手
不良信息举报
您举报文章:Redis 事务
举报原因:
原因补充:

(最多只允许输入30个字)