事务简介
- NoSQL数据库不支持ACID特征,但也是有自己的事务的。
(事务具有4个特征,分别是原子性、一致性、隔离性和持久性,简称事务的ACID特性) - redis事务是一个单独的格里操作:事务中的所有命令都会序列化且按顺序的执行。
- 事务之心的过程中,不会被其他客户端发过来的命令请求所打断。
- 我个人更喜欢把事务看成一个批处理
总结
redis的事务的主要作用就是串联多个命令防止别的命令插队
事务的三大特性
Multi,Exec,discard
- 从输入
Multi
命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec
后,Redis会将之前的命令队列中的命令依次执行。 - 在组队的过程中可以通过可以通过
discard
来放弃组队 - 这是尚硅谷课程ppt的一张图片,我觉得挺容易理解的
事务的错误处理
- 组队中的某个命令出现了报告错误(编译异常,比如单词拼写错误,注意这时候命令还未执行),执行的整个事务队列都会被取消,下面同样是尚硅谷的ppt截图
- 如果执行阶段某个命令报错,则只有报错的命令不会被执行,而其他的命令都会执行,且不会回滚(关系型数据库的事务会回滚,一有错误取消所有操作)
事务锁简介
在事务中,我们为了事务的冲突通常会给事务加一个锁来锁定数据。这样说比较抽象,我用一个案例来理解。
理解案例:
仓库里面有a裤子200条,有三个请求
- 买60条
- 买150条
- 买190条
这是三个不同客户端同时发送的请求,如果同时执行的话,他们才购买前查询到的库存都是200条,都满足购买条件,但是购买完后库存的剩余量变成了-200,这种情况中是非常严重的,为了避免这种错误的发生,我们通常就会给数据加了一个锁。
然而事务的锁又分为乐观锁(常用于非关系型数据库)和悲观锁(常用于关系型数据库)
悲观锁
简单来说就我们在执行事务前都会给我们需要的属性加上一个监听器,只要进行事务就会给这个数据上锁,在这个事务结束前不允许数据进行变化(甚至无法访问),知道这个事务结束完才会释放掉锁。这个经常在关系型数据库中看到。
乐观锁
简单来说就是我们我们在执行事务前都会给我们需要的属性加上一个监听器,事务开始时会给数据一个版本号,然后修改数据时版本号也会发生变化,数据进行修改时会拿访问数据拿到的版本号和数据当前的版本号就行修改,如果一样则执行修改,不一样的话直接停止没有下一步,直接操作失败(数据可以访问但无法修改),直到事务结束后给数据一个新的版本号
尚硅谷的ppt截图
上面的是我自己的理解,如果看不懂的话可以看一下尚硅谷的ppt,我觉得他ppt的还是挺好的
给数据添加监视的命令
WATCH <key1> <key2> ....
在执行multi
之前先执行该命令的haul可以监视一个或多个key,如果事务在执行时,这个或这几个key的值呗其他命令所改动,那么事务将被打断,返回nill(类似于null)
给数据取消监视命令
UNWATCH
取消所有对key的监视,如果在执行该命令前以执行EZEC
和DISCARD
命令的话,那么就不需要在执行unwatch