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的乐观锁。