MySQL事务和Redis事务对比

文章目录

  • MySQL事务
    • 四大特性
    • 并发事务问题
    • 事务隔离级别
  • Redis事务
    • 相关命令
    • 与MySQL事务的不同
        • 1. redis事务没有隔离级别概念
        • 2. redis事务不保证原子性

MySQL事务

四大特性

  • 原子性:事务是不可分割的,同成功,同失败
  • 隔离性:多个事务之间,操作不受影响
  • 一致性:事务完成时数据状态必须保持一致
  • 持久性:事务一旦提交或回滚是不可逆的

并发事务问题

因为事务的隔离性,可能会引发一系列问题

  • 脏读:一个事务读到另一个事务没提交的数据
  • 不可重复读:事务先后读取同一条记录,两次读取数据不同
  • 幻读:一个事务查询数据时,没有对应数据行,但插入时,发现有对应数据行了,好像出现了幻影

事务隔离级别

MySQL事务和Redis事务对比_第1张图片
性能逐渐降低,安全性逐渐升高

Redis事务

相关命令

multi  开启事务
exec 提交事务
discard 取消事务
watch 开启监控 (监控某一个key,可用来实现乐观锁)
unwatch 取消监控

MySQL事务和Redis事务对比_第2张图片

  • 排他性:事务中所有命令串行化的执行,Redis在此期间不会对其他客户端的请求提供任何服务
  • 一次性:事务在执行一次后就没了,如果需要重新执行,需开启新的事务
  • 顺序性:redis会顺序的执行一组命令,如果有一条命令执行失败,剩下的命令依然会执行

与MySQL事务的不同

1. redis事务没有隔离级别概念

批量操作在执行exec命令前被放入队列缓存中,并没有被实际执行,也就不存在事务内的查询会被看到,事务外的看不到,从而也不会出现并发事务问题

2. redis事务不保证原子性

单条命令的执行是保证原子性的,而事务是不保证的,且没有回滚,事务中任意命令失败,其他命令仍会执行

  • List item若命令中存在类似于Java运行时异常,执行exec时,错误命令抛出异常,其他命令正常执行
  • List item若命令中存在类似于Java编译时异常,执行exec命令时,所有命令都不会执行

你可能感兴趣的:(总结,mysql,redis,数据库)