美图欣赏:
事务是由一组DML语句组成的
事务的特点:要么成功,要么失败
事务的特性:ACID 原子性,一致性,隔离性,持久性
Redis的事务本质,是将一组操作放在队列中,然后一次执行。
**对比Oracle和Redis的事务区别:**
| | Oracle | Redis
| -------- | -------------------------------------------------------- | ----------------------------------
| 事务开启 | 自动开启 | 命令:multi (将多条语句一起执行)
| 执行语句 | DML | Redis命令
| 提交事务 | 显示提交:commit,隐式提交:DDL语句(create table) | 命令:exec
| 回滚事务 | 显示回滚:Rollback,隐式回滚:系统断电,客户端退出,自动回滚 | 命令:discard 将队列中的操作废弃掉
redis的事务,不是真正的事务,是一种事务的模拟。
举例:
模拟银行转账
[root@bigdata111 redis]# ./bin/redis-cli
127.0.0.1:6379> set zhangsan 2000
OK
127.0.0.1:6379> set lisi 2000
OK(命令运行成功就是ok)
127.0.0.1:6379> multi(开启事务)
OK
127.0.0.1:6379> decrby zhangsan 500
QUEUED(将命令成功放在队列中)
127.0.0.1:6379> incrby lisi 500
QUEUED
127.0.0.1:6379> exec(运行事务)
1) (integer) 1500
2) (integer) 2500
127.0.0.1:6379> get zhangsan
"1500"
127.0.0.1:6379> get lisi
"2500"
买票:
127.0.0.1:6379> get lisi
"2500"
127.0.0.1:6379> set ticket 1
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> decrby lisi 500(decrby减去多少)
QUEUED
127.0.0.1:6379> decr ticket(减去一可以使用decr)
QUEUED
在运行事务之前,在另一个窗口将票抢走,在现实应该是事务运行失败(需要使用redis的锁)
127.0.0.1:6379> exec
1) (integer) 2000
2) (integer) -1
redis的锁(简单锁):在执行事务操作的时候,如果监控的值发生变化,那么事务执行失败
锁命令:watch
127.0.0.1:6379> incrby lisi 500
(integer) 2500
127.0.0.1:6379> set ticket 1
OK
127.0.0.1:6379> WATCH ticket (锁,监控ticket值)
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> decrby lisi 500
QUEUED
127.0.0.1:6379> decr ticket
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get lisi
"2500"
127.0.0.1:6379> get ticket
"0"
nil:打印nil代表事务运行失败,或者是没有运行。
————保持饥饿,保持学习
Jackson_MVP