您的位置:首页 > 数据库 > Redis

Redis 事务

2018-03-29 12:17 232 查看
Redis 事务Redis 事务含义:
可以执行 一次多个 命令 。(是一组命令的集合)
一个事务中的所有命令都会有序列化。(按顺序的串化执行而不会被其他命令插入,不许加塞)
如同 GIT commit 提交。

作用:

一个队列中,一次性顺序性排他性执行一系列命令。

Redis 常用的命令
DISCARD 取消失误,放弃执行事务内的所有命令
EXEC 执行事务块内的命令
MULTI 标记一个事务的开始
UNWATCH 取消Watch 命令 对所有的 key 的监控
WATCH key [key...] 监视一个或多个 key, 如果在事务执行之前这个(或这些)key 被其他命令所改动,那么事务被打断。

正常执行
1.标记一个事务的开始 mluti。           

             


2. 写入执行的语句,写入的队列(queue)中。        
            


3.执行事务 exec    
            


放弃事务1.标记一个事务的开始 mluti。

2.写入执行的语句,写入到队列(queue)中。
3.执行放弃事务 discard。

               


全体连坐1.标记一个事务的开始 mluti。
2.写入执行的语句,写入到队列(queue)中。执行事务 exec,就会报错。 当执行语句中有语法错误,就会报错。

   

                

冤头债主1.标记一个事务的开始 mluti。
2.写入执行的语句,写入到队列(queue)中。。
3.执行事务 exec。当执行的事务中,有类型错误等逻辑错误 ,只执行对的语句。


watch 监控含义:Watch指令,类似乐观锁,事务提交时。如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行

<
4000
span style="font-size:18.6667px;">
悲观锁

含义: 很悲观,每次去数据库拿数据的时候都会认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿我这个数据就会block 直到它拿到锁。
例如:传统的关系性数据库里边就用到了很多这种锁的机制。行锁
表锁
读锁
写锁

都是在操作之前先上锁。
缺点:性能下降

乐观锁含义: 对事情的发展状况表示乐观状况。
例如: 不锁整个表,既保证高并发,又不锁整张表。方法:在每天记录后面加一个字段 version (行锁)

乐观的策略:提交的版本必须大于记录当前版本才能执行更新。

CAS

Watch 操作:1.设置 收入为100 ,支出为20, 剩余为80

                    

2.监控 收支的情况
                    

                3.如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行。
a. B 用户 操作balance 
                            

b. A 用户操作 监控的事务操作没有被执行
                          

                     
c.小结:通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败)

d.当发生以上情况的时候,正确的操作:       先执行放弃监控 unwatch
加载 监控的对象balance 
监控 ==>> 标记事务 ==>>执行语句 ==>>执行事务

                                    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Redis事务