本文学习redis的乐观锁机制与事务的三大特性
1. 基本操作
127.0.0.1:6379> set balance 100
OK
# 在shell1中执行watch监听balance
127.0.0.1:6379> watch balance
OK
# 在shell2中执行watch监听balance
127.0.0.1:6379> watch balance
OK
# 在shell1中执行multi开始事务
127.0.0.1:6379> multi
OK
# 在shell2中执行multi开始事务
127.0.0.1:6379> multi
OK
# 在shell1中执行incrby增加余额50
127.0.0.1:6379(TX)> incrby balance 50
QUEUED
# 在shell2中执行incrby减少余额50
127.0.0.1:6379(TX)> decrby balance 50
QUEUED
# 在shell1中执行exec执行事务失败,因为监视到了key被其他命令所改动
127.0.0.1:6379(TX)> exec
(nil)
# 在shell2中执行exec执行事务成功
127.0.0.1:6379(TX)> exec
1) (integer) 50
# unwatch取消对所有key的监视
127.0.0.1:6379> unwatch
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> decrby balance 55
QUEUED
# discard方式事务
127.0.0.1:6379(TX)> discard
OK
2. redis事务三大特性
- 单独的隔离操作 事务中的所有命令都会按顺序一一执行。事务执行过程中,不会被其他客户端所打断
- 没有隔离级别的概念 当事务开启时,事务期间的命令并没有执行,而是加入队列,只有执行EXEC命令时,才会执行
- 不保证原子性 事务中如果一条命令执行失败,其他的命令仍会执行,不会回滚
127.0.0.1:6379> set a 100
OK
127.0.0.1:6379> set b 100
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> incrby a 50a
QUEUED
# decrby b命令仍会执行,不会回滚
127.0.0.1:6379(TX)> decrby b 50
QUEUED
127.0.0.1:6379(TX)> exec
1) (error) ERR value is not an integer or out of range
2) (integer) 50
127.0.0.1:6379> get b
"50"
127.0.0.1:6379> get a
"100"
欢迎关注公众号算法小生查看最新文章
版权声明:本文为SJshenjian原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。