Redis介绍之事务(四)

事务(Redis部分支持事务)

1、是什么?

可以一次执行多个命令,本质是一组命令的集合。一个事物中的所有命令都会被序列化,按顺序的串行执行而不会被其他命令插入,不许加塞。
(CAS check and setting)

2、能干嘛?

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

3、常用命令

命令 描述

multi 标记一个事务的开始
exec 执行所有事务块内的命令
discard 取消事务,放弃执行事务块内的所有命令
watch key [key] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
unwatch 取消watch命令对所有 key 的监视。

4、操作

1、正常执行

multi 开始 ------> 输入命令(没执行仅仅入队)------->exec (执行)
在这里插入图片描述

2、放弃事务

multi 开始 ------> 输入命令(没执行仅仅入队)------->discard (取消执行)
在这里插入图片描述

3、全体连坐

一次事务中某一条执行命令出现错误,就会导致最后的整个事务执行不成功
在这里插入图片描述

4、冤头债主

一次事务中某一条在实际的执行命令出现错误,其他语句不会影响。对的执行,错的抛出
在这里插入图片描述

5、乐观锁和悲观锁

乐观锁:乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。(一般都是乐观锁)(提交的版本必须大于记录当前版本才能执行更新)

悲观锁:当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)。

6、Watch监控

watch指令,类似乐观锁,如果key的值已经被修改了,那么整个事务队列都不会被执行,同时返回一个Nullmulti-bulk应答以通知调用者事务执行失败。
注意:一旦执行了exec或者discard,之前加的所有监控锁都会被取消掉了。

watch key_name:对某个key进行监控

无加塞篡改:在watch之后,一直都没有对监控的数据进行更新,这样事务即可执行成功。
在这里插入图片描述

有加塞篡改,当watch的key被修改,后面的那个事务全部执行失败
在这里插入图片描述

当自己已知在watch后key被修改,可以用unwatch来取消监控,这样后面的事务就不会执行失败
在这里插入图片描述

Java中

Jedis jedis = new Jedis("主机地址",端口号);
Transacion teansaction = jedis.multi(); //获取事务
teansaction.set("key","value");
teansaction.exec(); //提交
teansaction.discard(); //放弃提交
jedis.watch(key); //对key加监控,如果在这句之后加了set,事务就会执行失败
jedis.unwatch(); //取消监控

猜你喜欢

转载自blog.csdn.net/weixin_42272869/article/details/112744151