redis中的事务

一、什么是事务

事务(Transaction)是一种并发控制单元。在关系型数据库中,事务是一组操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单元。但是redis的事务,稍有不同。

二、为什么需要使用事务

以支付场景为例,A向B支付100元,需要在A的账户中扣去100元,在B的账户中增加100元。这两个操作如果其中一个操作成功,另一个操作失败,就会导致问题。比如A付了钱B没有收到,或者A没付钱B收到了。我们可以使用事务将这两个操作变成一个原子性操作,要么一起成功,要么都不成功

三、事务使用的基本流程

  1. 普通事务使用
  • 开启事务
  • 执行事务操作,提交事务
  • 事务操作出现异常,回滚事务
    Java示例代码如下:
// 开启事务
begin();
try {
   // 执行业务
    doSomeThing();
    // 提交事务
    commit();
} catch(Exception e) {
    // 回滚事务
    rollback();
}

  1. redis事务使用
  • 开始事务 (multi)
  • 命令入队
  • 执行事务/放弃事务
    示例如下:
// 开启事务
> multi 
OK
// 命令 入队
> set key val
QUEUED
> set key1 val1
QUEUED
> get key
QUEUED
// 执行事务/取消事务
> exec(discard)
OK

执行流程如下:

1665371211336.jpg

差异

redis中的事务操作有三种错误,分别是运行时错误,入队时错误(不终止事务),入队时错误(终止事务)。redis中的事务不支持回滚!!!
官方文档解释如下:

If you have a relational databases background, the fact that Redis commands can fail during a transaction, but still Redis will >execute the rest of the transaction instead of rolling back, may look odd to you.

However there are good opinions for this behavior:

Redis commands can fail only if called with a wrong syntax (and the problem is not detectable during the command queueing), >or against keys holding the wrong data type: this means that in practical terms a failing command is the result of a >programming errors, and a kind of error that is very likely to be detected during development, and not in production.
Redis is internally simplified and faster because it does not need the ability to roll back.
An argument against Redis point of view is that bugs happen, however it should be noted that in general the roll back does not >save you from programming errors. For instance if a query increments a key by 2 instead of 1, or increments the wrong key, >there is no way for a rollback mechanism to help. Given that no one can save the programmer from his or her errors, and that >the kind of errors required for a Redis command to fail are unlikely to enter in production, we selected the simpler and faster >approach of not supporting roll backs on errors.

说redis的命令在事务中可以失败,但是redis仍然会在失败后执行后面的命令而不是回滚。
redis的命令可能会发生语法错误,或者keys持有了错误的数据类型,但是这种错误在命令入队时不会被发现,这意味着错误是由于编程错误导致的,这是一种在开发环境中可以发现的错误而不该出现在生产环境。
redis追求简单快速的设计理念,所以它不需要回滚的能力
bug总会发生,需要明白的是回滚并不会纠正你的编码错误。比如说一个请求需要将某个key值增加2而不是1,或者增加到了错误的key上,这些错误使用回滚机制并没有帮助。程序员自己的错误是无法拯救的,那些会导致redis命令失败的错误不应该出现在生产环境,我们选择了一个简单快速的方案,在发生错误时不去回滚。

根据官方的解释,可以总结出redis的事务只能保证按顺序执行一组操作,但是不支持要么一起成功,要么一起失败。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容