目录
本文单一根据Redis事务来进行讲解,如有错误,请指教,谢谢!
Redis事务简介
Redis事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队。
事务过程
当我们在Redis中开启(Multi)一条事务之后,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将命令队列中的命令依次执行。当然在Exec之前我们可以通过Discard来放弃命令队列中的命令来取消事务。
开启事务
执行MULTI命令表示开启事务,此时客户端会从非事务状态切换到事务状态。
命令入队
开启事务后,接收到命令,则会将命令按顺序的放入队列存储起来,并不会直接执行。
如果接收到这些特殊的指令Discard,Exec,Watch则会直接执行。
如果接收到错误的命令,比如
seeeet k1 v1
那么整个命令队列在执行时,会被取消执行。
取消事务
可以通过Discard命令来放弃队列中的命令并取消此次事务。
执行事务
通过执行Exec命令,Redis会将队列中的命令按先进先出顺序依次执行。
整个执行过程不具有原子性,但执行过程中的单条命令具有原子性,如果其中一条执行失败并不会妨碍其他指令的执行,并不具有回滚的操作。
所有执行的命令的执行结果也会按顺序的放入一个队列存储起来,在全部执行完成之后按先进先出顺序进行返回给客户端,最后事务执行完毕并结束本次事务。
锁机制
悲观锁
顾名思义,很悲观,认为当拿到数据后别人可能会修改数据,所以在每次拿到数据后就会上锁,这样别人再拿该数据时就会阻塞直接拿到的人释放锁。
传统的关系型数据库中就有很多用到了这种锁机制,如行锁,表锁,读锁,写锁都是在操作之前先上锁。
乐观锁
顾名思义,很乐观,认为当拿到数据后别人不可能会修改数据,但是当操作该数据时,会判断该数据与拿到时是否一致,一旦被别人修改过,则操作失败。
类似于拿到时该数据version为1,如果有他人修改则version就会变化,当我们去操作时会判断该数据的版本是否为1。
Watch
Watch指令是乐观锁的方式,用于在事务开始之前对一个或多个key进行监视,在事务执行时如果这些key被别人修改过,则整个事务执行失败。
UnWatch
取消 WATCH 命令所监视的所有key。
当事务执行完成,执行失败或取消事务,则自动释放Watch锁监视的key。
应用场景
当我们的账户有1000rmb,然后手机端和电脑端同时登陆了我们的账户,同时发送消费500和800的请求,如果不加锁机制,则会出现-300的余额,这显然是血赚。
Redis事务特性
单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别概念
队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行。
不保证原子性
事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。