企业网站建设及维护,wordpress 微信 插件,品牌推广的方式有哪些,如何在电脑上做物流网站1.Redis事务控制的相关命令
命令名作用MULTI表示开始收集命令#xff0c;后面所有命令都不是马上执行#xff0c;而是加入到一个队列中。EXEC执行MULTI后面命令队列中的所有命令。DISCARD放弃执行队列中的命令。WATCH“观察“、”监控“一个KEY#xff0c;在当前队列外的其…1.Redis事务控制的相关命令
命令名作用MULTI表示开始收集命令后面所有命令都不是马上执行而是加入到一个队列中。EXEC执行MULTI后面命令队列中的所有命令。DISCARD放弃执行队列中的命令。WATCH“观察“、”监控“一个KEY在当前队列外的其他命令操作这个KEY时放弃执行自己队列的命令UNWATCH放弃监控一个KEY
2.命令队列执行失败的两种情况
①加入队列时失败
127.0.0.1:6379 multi
OK
127.0.0.1:6379 set age 20
QUEUED
127.0.0.1:6379 incr age
QUEUED
127.0.0.1:6379 incr age www
(error) ERR wrong number of arguments for incr command
127.0.0.1:6379 exec
(error) EXECABORT Transaction discarded because of previous errors.
遇到了入队时即可检测到的错误整个队列都不会执行。
②执行队列时失败
127.0.0.1:6379 multi
OK
127.0.0.1:6379 set age 30
QUEUED
127.0.0.1:6379 incrby age 5
QUEUED
127.0.0.1:6379 incrby age 5
QUEUED
127.0.0.1:6379 incrby age ww
QUEUED
127.0.0.1:6379 incrby age 5
QUEUED
127.0.0.1:6379 EXEC
1) OK
2) (integer) 35
3) (integer) 40
4) (error) ERR value is not an integer or out of range
5) (integer) 45
127.0.0.1:6379 get age
45
错误在入队时检测不出来整个队列执行时有错的命令执行失败但是其他命令并没有回滚。
③Redis为什么不支持回滚
官方解释如下
如果你有使用关系式数据库的经验 那么 “Redis 在事务失败时不进行回滚而是继续执行余下的命令”这种做法可能会让你觉得有点奇怪。以下是这种做法的优点 1.Redis 命令只会因为错误的语法而失败并且这些问题不能在入队时发现或是命令用在了错误类型的键上面这也就是说从实用性的角度来说失败的命令是由编程错误造成的而这些错误应该在开发的过程中被发现而不应该出现在生产环境中。 2.因为不需要对回滚进行支持所以 Redis 的内部可以保持简单且快速。 有种观点认为 Redis 处理事务的做法会产生 bug 然而需要注意的是 在通常情况下 回滚并不能解决编程错误带来的问题。 举个例子 如果你本来想通过 INCR 命令将键的值加上 1 却不小心加上了 2 又或者对错误类型的键执行了 INCR 回滚是没有办法处理这些情况的。
3.悲观锁和乐观锁
在使用WATCH命令监控一个KEY后当前队列中的命令会由于外部命令的执行而放弃这是乐观锁的体现。
- 悲观锁
认为当前环境非常容易发生碰撞所以执行操作前需要把数据锁定操作完成后释放锁其他操作才可以继续操作。
- 乐观锁
认为当前环境不容易发生碰撞所以执行操作前不锁定数据万一碰撞真的发生了那么检查版本号 - 如果是基于最新的版本所做的修改服务器接受修改成功 - 如果是基于旧的版本号所做的修改服务器不接受修改失败整个MULTI队列中的操作都被丢弃