找回密码
 立即注册
首页 业界区 安全 Redis学习笔记--事务

Redis学习笔记--事务

纣捎牟 昨天 16:59
 事务

mysql事务:mysql的事务是指在一组sql语句串行执行的时候,要么都成功,要么都失败,而且执行过程中不会被其它sql语句干扰。mysql事务使用的是begin、commit/rollbackredis事务:redis的事务和mysql类似,是一组redis语句串行执行,所有命令都会序列化,而且执行过程中不会被其它redis命令干扰。redis事务使用的是multi、execredis的事务在执行的时候通过multi开启,multi之后执行的所有命令都会被放到一个队列中(queue)通过exec命令来按照顺序依次触发队列中redis命令的执行,这个过程中不允许有其它redis命令干扰。 事务的步骤:1、开启:以multi开始一个事务,如果需要监控可以在multi前增加watch2、入队:将多个命令放入到队列中,这些命令并不会立即执行而是放到等待执行的事务队列中3、执行:通过exec命令触发事务执行 Redis事务和mysql事务的区别:1、没有单独的隔离操作:Redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的2、没有隔离级别:因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题了3、不保证原子性:Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力4、排它性:Redis会保证一个事务内的命令依次执行,而不会被其它命令插入 事务命令:
1.png
 执行场景:1、正常执行:通过multi开启redis的事务,multi和exec之间的redis命令会被放到队列中依次执行且不被其它命令干扰,直到全部执行完成为止。示例参考下图:
2.png
 2、放弃事务:通过multi开启redis事务,multi和exec之间的redis命令如果包含discard则放弃事务内所有redis命令的执行。示例参考下图:
3.png
 3、语法错误:通过multi开启redis事务,在exec之前如果有命令输入错误(例如语法错误)在执行exec的时候就会提示事务已经被取消了,所有的命令都没能执行成功。这个失败的触发点是在exec执行前。示例参考下图:
4.png
 4、运行时错误:通过multi开启redis事务,在exec之后发现有部分命令并没有语法错误,但是是无法执行的(例如不存在对应的key做自增操作)则其它正确的命令正常执行,失败的命令报异常,且数据无法回滚。这点和传统数据事务有很大区别,示例参考下图:
5.png
 5、Watch监控:redis采用乐观锁,在通过multi开始事务前使用watch监控某个key,之后输入redis命令,系统会把命令添加到队列中,在执行exec触发事务时,被监控的key发生了变更则当前事务中的所有redis命令都失败并返回nil,需要重新执行,如果监控key没有发生变更则事务成功。无论成功与否在exec执行完之后都会释放watch对某个key的监控。
6.png
 
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册