0%

【Redis】Redis的事务

虽然Redis是非关系型数据库,但是也是拥有一定的事务功能

1. 事务介绍

  • 可以一次执行多个命令,本质是一组命令的集合。
  • 一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞

2.事物使用

  • 在命令行使用multi,命令行会返回一个OK,表示事务开启,这时候可以输入一系列操作命令。
  • 输入完一系列操作命令,使用exec来执行事事务
  • 一旦不想使用事务的时候,命令行输入discard来取消使用事务

3.事务操作指令

3.1 常用指令

命令 描述
multi 标记一个事务块的开启
discard 取消事务,放弃执行事务块内的所有事物
exec 执行所有事物块里面的命令
watch [key …] 监视一个或多个key,如果在事务执行之前key被其他命令所改动,事务中断
unwatch 取消watch命令对所有key的监视

3.2 正常执行

3.3 放弃执行

3.4 全体连坐

3.5 冤头债主

  • 与全体连坐的区别:
    • 全体连坐在编译的时候已经报错了,所以执行全部不执行
    • 冤头债主则是编译没有报错,所以执行时出现错误不影响其他语句执行
    • 总结:Redis的事务是部分支持,不是全部都支持

3.6 watch监控

    • 乐观锁:在每条记录后面都添加一个版本号(Version),对记录进行操作时获取当前版本号,操作完准备提交前也获取一次版本号,一旦版本号不同,报出异常。版本号一样就成功提交。
    • 悲观锁:一旦数据被人拿来就修改,就将整个数据库锁起来,等修改完后,才能给下一个人进行修改。
  • watch使用例子(乐观锁):信用卡可用余额和欠债
  • 取消监控:
    • (1)输入命令unwatch
    • (2)一旦事务使用exec执行后,自动取消监控

4. 总结

4.1 事务三阶段

  • (1)开启:用multi命令开启一个事务
  • (2)入队:将多个命令入队到十五中,接到这些命令并不会立即执行,而是方法哦等待执行的事务队列里面
  • (3)执行:用exec命令执行事务

4.2 事务三特性

  • (1)单独的隔离操作:事务中的所用命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断
  • (2)没有隔离级别的概念:队列中的命令没有提交之前都不会实际的执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里面的更新,在事务外查询不能看到”这个让人万分头疼的问题
  • (3)不保证原子性:redis同一个事务中如果有一条命令执行失败,气候的命令仍然会被执行,没有回滚