redis事务

redis事务

事务一般包括多个操作,不能被打断

Multi、Exec、discard

从输入multi命令开始,输入的命令都是依次进入命令队列中,但不会执行,直到输入exec后,redis会将之前的命令队列的命令队列的命令依次执行

组队的过程中可以通过discard来放弃组队。

举例:

事务中某个命令出现错误

则整个事务的组队队列会被取消

事务冲突问题

场景:有很多人知道你的账户,都想去双十一买东西

例子:

​ 一个人想给金额减去8000

​ 一个人想给金额减5000

​ 一个人想给金额减1000

解决方案

:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所有每次在拿数据的时候都会上锁。传统的关系型数据库都会用到这种锁机制

:乐观锁是对于数据冲突保持一种乐观态度,操作数据时不会对操作的数据进行加锁,只有到数据提交的时候才通过一种机制来验证数据是否存在冲突。

乐观锁通常是通过在表中增加一个版本(version)或时间戳(timestamp)来实现,其中,版本最为常用。

乐观锁每次在执行数据的修改操作时,都会带上一个版本号,一旦版本号和数据的版本号一致就可以执行修改操作并对版本号执行 +1 操作,否则就执行失败。

典型的例子:抢票系统

乐观锁的命令

watch key.....

第一个终端

第二个终端

redis事务的三特性

1.单独的隔离操作:

​ 事务中的所有命令都会被序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送过来的请求说打断。

2.没有隔离级别的概念

​ 队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被执行

3.不保证原子性

​ 事务中如果有一条命令执行失败,其后面的命令仍然会被执行,没有回滚

posted @ 2022-11-21 15:03  wiselee/  阅读(22)  评论(0编辑  收藏  举报