相关命令
Copy
| -MULTI 开启 |
| -EXEC 执行 |
| -DISCARD 取消 |
Copy
| #开启事务 |
| 127.0.0.1:6379> MULTI |
| OK |
| #将a:stock减1, |
| 127.0.0.1:6379> DECR a:stock |
| QUEUED |
| #将b:stock减1 |
| 127.0.0.1:6379> DECR b:stock |
| QUEUED |
| #实际执行事务 |
| 127.0.0.1:6379> EXEC |
| 1) (integer) 4 |
| 2) (integer) 9 |
redis事务是否保证原子性?
(1). 命令本身就有错误(比如语法错误,使用了不存在的命令,例如:put a:stock 1) ,在入队时就被redis判断出来了,这样的情况所有操作都不会执行
案例
Copy
| |
| #开启事务 |
| 127.0.0.1:6379> MULTI |
| OK |
| #发送事务中的第一个操作,但是Redis不支持该命令,返回报错信息 |
| 127.0.0.1:6379> PUT a:stock 5 |
| (error) ERR unknown command `PUT`, with args beginning with: `a:stock`, `5`, |
| #发送事务中的第二个操作,这个操作是正确的命令,Redis把该命令入队 |
| 127.0.0.1:6379> DECR b:stock |
| QUEUED |
| #实际执行事务,但是之前命令有错误,所以Redis拒绝执行 |
| 127.0.0.1:6379> EXEC |
| (error) EXECABORT Transaction discarded because of previous errors. |
(2). 命令和操作的数据类型不匹配,但是入队时没有检测出来 ,比如 lpop a:stock 1 ,这种情况下错误的命令会报错,但是正确的命令会执行,也就是失去了原子性
案例
Copy
| |
| #开启事务 |
| 127.0.0.1:6379> MULTI |
| OK |
| #发送事务中的第一个操作,LPOP命令操作的数据类型不匹配,此时并不报错 |
| 127.0.0.1:6379> LPOP a:stock |
| QUEUED |
| #发送事务中的第二个操作 |
| 127.0.0.1:6379> DECR b:stock |
| QUEUED |
| #实际执行事务,事务第一个操作执行报错 |
| 127.0.0.1:6379> EXEC |
| 1) (error) WRONGTYPE Operation against a key holding the wrong kind of value |
| 2) (integer) 8 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!