MySQL事务
四大特性
- 原子性:事务是不可分割的,同成功,同失败
- 隔离性:多个事务之间,操作不受影响
- 一致性:事务完成时数据状态必须保持一致
- 持久性:事务一旦提交或回滚是不可逆的
并发事务问题
因为事务的隔离性,可能会引发一系列问题
- 脏读:一个事务读到另一个事务没提交的数据
- 不可重复读:事务先后读取同一条记录,两次读取数据不同
- 幻读:一个事务查询数据时,没有对应数据行,但插入时,发现有对应数据行了,好像出现了幻影
事务隔离级别
性能逐渐降低,安全性逐渐升高
Redis事务
相关命令
multi 开启事务
exec 提交事务
discard 取消事务
watch 开启监控 (监控某一个key,可用来实现乐观锁)
unwatch 取消监控
- 排他性:事务中所有命令串行化的执行,Redis在此期间不会对其他客户端的请求提供任何服务
- 一次性:事务在执行一次后就没了,如果需要重新执行,需开启新的事务
- 顺序性:redis会顺序的执行一组命令,如果有一条命令执行失败,剩下的命令依然会执行
与MySQL事务的不同
1. redis事务没有隔离级别概念
批量操作在执行exec命令前被放入队列缓存中,并没有被实际执行,也就不存在事务内的查询会被看到,事务外的看不到,从而也不会出现并发事务问题
2. redis事务不保证原子性
单条命令的执行是保证原子性的,而事务是不保证的,且没有回滚,事务中任意命令失败,其他命令仍会执行
- List item若命令中存在类似于Java运行时异常,执行exec时,错误命令抛出异常,其他命令正常执行
- List item若命令中存在类似于Java编译时异常,执行exec命令时,所有命令都不会执行