redis之事务

redis的事务能够确保:

1、事务里面的所有操作能够被连续顺序地执行。事务执行期间,其他客户端的请求不会插入到事务的操作之间执行。

2、原子性:事务的操作,要不被全部执行,要么全部都不执行。

事务的命令

redis的以multi命令开启事务,之后执行事务的操作,最后以exec命令执行事务,如下:

multi

operation1

operation2

exec

事务里面的所有操作在执行后,redis服务端都返回QUEUED应答。exec执行返回一个数组的应答,里面的元素分别是每个事务里面操作的返回。

在事务期间如果要撤销之前的操作,执行discard命令,并且退出事务。

事务的错误

redis事务执行过程中,可能有以下两种错误:

1、事务命令入队错误,例如错误的命令类型、错误的命令参数。

2、exec命令执行之后发生的错误,例如命令和key的类型不匹配。

第一种错误由redis的客户端(2.6.5版本之后redis服务端也能够记录事务过程中命令入队异常的错误)来感知,如果事务里面的命令没有返回QUEUED应答,说明入队失败,客户端会主动退出事务。

如果是exec之后发生的错误,redis不会回滚能够正确执行的命令的操作。exec的应答数组对应的命令的应答可以反映出哪个命令发生了错误。

乐观锁和CAS操作

watch命令为redis的事务提供CAS的保证。watch命令后面的key,都会被监视。如果exec命令执行之前,被监视的key任意一个或者多个被修改了,事务执行失败。watch命令能够是redis的事务检测到竞态条件,被监视的key必须都没有被修改事务才能执行。

事务执行之后(无论成功还是失败),或者客户端连接断开,被监视的key都会还原为无监视的状态。也可以通过执行unwatch命令取消所有已监视的key的监视状态。

被监视的key可以被其它连接读取或者修改,所以watch的乐观锁。

    原文作者:麦香小瑜儿
    原文地址: https://www.jianshu.com/p/34561c6535aa
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞