首页 > 编程知识 正文

redis事务回滚,redis java客户端

时间:2023-05-05 02:05:44 阅读:159323 作者:4132

原始标题: Redis事务支持

Redis事务支持

Redis中与事务相关的命令包括MULTI、EXEC、DISCARD、WATCH和UNWATCH。

Redis事务保证原子性。 所有命令都会执行,或者不是所有命令都会正常执行。 或者不执行

事务以MULTI开始,以EXEC或DISCARD结束。 例如:

原子删除多个key :

(版本3.2.5 )

Redis对MULTI后面的多个命令进行排队,等待EXEC时按顺序执行队列中的命令,执行事务中的命令时不处理来自其他客户端的请求。

事务错误有两种情况。

命令不排队。 因此,在运行EXEC之前可以知道这个错误。 正常排队时会返回“QUEUED”。 在什么情况下,会发生无法排队的情况? 例如,错误的命令、命令参数不匹配、Redis服务器的内存不足等

在2.6.5版之前,客户端必须手动检查所有命令是否入队成功,客户端才能识别第一个错误。 (如果没有返回QUEUED或入队发送错误,则只需调用DISCARD来结束事务,否则会导致某些命令执行成功,而某些命令执行失败。 例如:

(版本2.4.5 )

上面的事务有两条指令,第二条是由于语法错误导致入队失败。 调用exec时,redis会执行队列中的指令,即incr k1,因为它不知道存在入队失败的指令。 因此,对客户端来说会产生矛盾。

从2.6.5版开始,不需要自己检查所有命令是否入队成功。 Redis会自己记录命令是否入队失败,如果失败,在调用EXEC时会返回错误。 此时,调用DISCARD结束事务即可

同样的例子:

(版本3.2.5 )

与2.4.5版不同,调用exec时,redis不会执行事务的命令并返回错误

指令本身如语法所示,但在执行过程中会发生错误。 也就是说,在EXEC调用后发生错误。 例如,incr非数值型的key

演示:

(版本2.6.5 )

(版本3.2.5 )

我们可以看到这种情况。 所有版本都是相同的,但会导致某些命令执行成功,而某些命令执行失败。 这意味着Redis事务没有回滚概念。 (__-),官方怎么解释这个? 参照文章的末尾。

WATCH和UNWATCH命令

redis的watch实现乐观锁定的效果,在watch中实现incr :

Redis代码:

我的钥匙

val=GET mykey

val=val 1

多重

设置我的钥匙$ val

执行

如果在事务执行过程中另一个客户端更改了mykey的值,则事务将失败。 这类似于cas操作。 通过在客户端组成循环,可以实现加1的操作

在以下情况下,调用UNWATCH而不显示:

调用exec或discard时,所有已watched的密钥都将处于unwatched状态。

如果connection断开连接,则该connection上的所有watched key都将处于unwatched状态

whyredisdoesnotsupportrollbacks?

ifyouhavearelationaldatabasesbackground,thefactthatrediscommandscanfailduringatransaction,butstillrediswilexecutetthereston

howevertherearegoodopinionsforthisbehavior :

rediscommandscanfailonlyifcalledwithawrongsyntax (andtheproblemisnotdetectableduringthecommandqueueueing )、 oragainstkeysholdingthewrongdatatype : thismeansthatinpracticaltermsafailingcommandistheresultofaprogrammingerrors, andakindoferrorthatisverylikelytobedetectedduringdevelopment,and not in production。

redisisinternallysimplifiedandfasterbecauseitdoesnotneedtheabilitytorollback。

anargumentagainstredispointofviewisthatbugshappen、 howeveritshouldbenotedthatingeneraltherollbackdoesnotsaveyoufromprogrammingerrors.forinstanceifaqueryincrementsakeyby2inst eakeyby 2 or increments the wrong key,thereisnowayforarollbackmechanismtohelp.giventhatnoonecansavetheprogrammerfromhisorhererrrors, andthatthekindoferrorsrequiredforarediscommandtofailareunlikelytoenterinproduction,weselectedthesimplerandfasterapproapraproachoachofnthofndored

我个人认为这个解释是不可能的。 程序员犯两个人是很正常的。 在一个事务的中途弄错一个命令的话,就会出现不一致的情况。 这让比价很尴尬,所以我不知道这个事务可以在哪里使用。 向路过的伟大的人请示

关注JAVA思考者

查看更多关于Java技术的精选文章

责任编辑:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。