事务的三大特性
1.单独隔离
事务中的所有命令都会被序列化,并依次执行。事务在执行时,不会被其他命令打断
2.无隔离级别概念
事务中的所有命令被提交执行前均不会执行,而是进入队列等待执行
3.不保证原子性
事务中的命令发生运行时异常时(可编译通过),该命令不执行并抛出异常,但其他命令照常执行,事务并不发生回滚
注:编译异常时(代码或命令错误)所有命令均不执行,事务被放弃,并抛出异常
事务的命令
命令 | 描述 |
---|---|
multi | 开启事务 |
exec | 提交执行事务 |
discard | 放弃事务(事务中已有的命令不会执行) |
watch key [key...] | 监视key,若批量监视则key之间以空格分隔 |
unwatch | 取消所有监视 |
监视key时(watch、unwatch):
监视(Redis的乐观锁):若被监视的key在事务提交执行前就被修改,则事务被放弃,返回nil;另外,事务执行完成后,自动取消所有监视
示例:
模拟线程1:
模拟线程2:
此时提交执行线程1的事务,可以看到事务被放弃:
经测试,事务执行完成后确实取消了监视:
放弃事务时(discard):
发生运行时异常或编译异常时:
事务中的命令发生运行时异常时(此处异常为String类型不可进行+1):
可以看到除 incr key1 命令未执行并抛出异常外,其余命令均正常执行,事务未发生回滚
事务存在编译异常时(此处为命令错误):
可以看到事务中的所有命令均未执行,事务被放弃,并抛出异常