在MySql中事务有四大特性,分别是:原子性、一致性、隔离性、持久性。简称ACID特性。
在Redis中的事务本质上是一组命令操作的集合,在事务执行的过程中,这些命令会被序列化,按照顺序依次执行。Redis事务特点:一次性、顺序性、排他性。
Redis事务没有隔离性,而且也不是直接执行的。Redis事务执行流程图:
一个事务正常执行过程:
如果我们在编写事务时想要取消这个事务,我们可以在事务提交之前使用DISCARD
命令,将事务取消。其中入队的命令也不会被执行,在下一次执行事务是还需要重新再开启事务。
当我们在事务执行或命令入队时出现编写错误,比如格式错误,语法错误等等,此时会发生编译异常,会有错误提示。虽然事务依然能够提交,但是整个事务队列的命令都不会执行。
运行时异常一般不会是因输入错误命令而报错,例如除0等逻辑问题。
注意了!!运行时异常的处理与编译异常不同!在Redis事务中命令存在运行时异常,在提交事务之后,存在错误命令的单条指令执行失败,其他正确命令正常执行!
Redis中存在锁机制,分为乐观锁和悲观锁。
实现乐观锁命令:WATCH key [key...]
我们举一个例子实现一下:
假如将1000块存进银行,然后从银行中消费100元。
我们可以定义一个key为’money’表示银行中我的账户余额,再定义一个’outmoney’字段表示我们消费的数额。我们要开启一个事务并且执行下面这样的一个任务:“money’中减100元,则’outmoney’增加100元,在开启事务之前先使用WATCH命令去监控money字段。
如图的确实现了’money’中减100元,'outmoney’增加100元,没有其他的问题。但是如果我们再次重复刚才的操作,结果应该是800 200。这次我们先将命令入队不提交(不进行EXEC命令),再打开第二个新的Redis客户端,修改’money’的值,然后再提交(第一个输入EXEC命令)事务,此时会执行失败。
在给字段添加监控的情况下通过事务去操作字段,如果在未提交时,有新的命令修改了字段值,那么事务一定会提交失败,但是在未监控的情况下,事务仍能提交成功!这就是Redis的乐观锁实现!
所以在实现乐观锁时,开启事务之前,一定要先给字段增加监控!
另外注意:Redis在每次事务提交之后,无论事务执行成功与否,该事务都会关闭,监控也会自动取消,在下次执行事务时都需要重新开启!
因篇幅问题不能全部显示,请点此查看更多更全内容