Skip to content

Latest commit

 

History

History
65 lines (54 loc) · 1.75 KB

09.事务.md

File metadata and controls

65 lines (54 loc) · 1.75 KB

1. 事务命令

命令 说明
muitl 开启事务命令
command 普通命令
discard 在提交前取消
exec 提交

注:discard只是结束本次事务,前2条语句已经执行,造成的影响仍然还在。

语句出错有两种情况: - 语法有问题,exec时报错,所有语句取消执行,没有对数据造成影响。 - 语法本身没错,但适用对象有问题(比如 zadd 操作list对象),exec之后,会执行正确的语句,并跳过有不适当的语句,对数据会造成影响,这点由程序员负责。

2. 乐观锁

redis的事务中启用的是乐观锁,只负责监测key没有被改动,如果在事务中发现key被改动,则取消事务。使用watch命令来监控一个或多个key,使用unwatch命令来取消监控所有key。

# 示例
watch key
muitl
操作数据...
exec
unwatch

模拟抢票,场景:用户买一张票,扣掉100元

# 在zhangsan买票过程中,在提交事务前一瞬间,有人成功买到票,ticket已经改变(即使ticket还有票),导致zhangsan抢票失败。
127.0.0.1:6379> watch ticket
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decr ticket
QUEUED
127.0.0.1:6379> decrby zhangsan 100
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get zhangsan
"1000"
127.0.0.1:6379> get ticket
"2"
127.0.0.1:6379> unwatch
OK


# lisi在买票整个过程都没有人抢票,所以lisi一次抢票成功。
127.0.0.1:6379> watch ticket
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby lisi 100
QUEUED
127.0.0.1:6379> decr ticket
QUEUED
127.0.0.1:6379> exec
1) (integer) 700
2) (integer) 1
127.0.0.1:6379> unwatch