目录
一、Redis基本的事务操作
1、原子性:
2、Redis事务
Redis事务执行顺序:
Redis事务演示:
3、异常
二、Redis实现乐观锁(面试常问)
1、悲观锁
2、乐观锁(常用)
3、Redis监视测试
无变化,正常执行:
有变化,停止执行:
一、Redis基本的事务操作
1、原子性:
要么同是成功吗,要么同时失败;
Redis单条命令保证原子性,但是Redis的事务不保证原子性!
2、Redis事务
事务指的是一组命令的集合;
一个事物的所有命令都会被序列化,在事务执行的过程中,会按照顺序执行;
一次性、顺序性、排他性;
Redis事务没有隔离级别的概念;
Redis单条命令保证原子性,但是Redis的事务不保证原子性!
所有的命令在事务中,并没有直接被执行,只有在发起执行命令的时候才会执行,Exec;
Redis事务执行顺序:
开启事务(multi)——命令入队——(取消执行事务discard)——执行事务(Exec);
取消执行事务:discard;
Redis事务演示:
代码:
图解:

3、异常
编译型异常:代码有问题、命令有问题,所有的命令都不会执行;

运行时异常(如1/0):如果事务队列中存在语法性错误,那么执行命令的时候,其他正确的命令可以正常执行,所以说Redis的事务是没有原子性的;

二、Redis实现乐观锁(面试常问)
1、悲观锁
很悲观,认为什么时候都会出问题,无论做什么都加锁(影响性能);
2、乐观锁(常用)
很乐观,认为什么时候都不会出现问题,所以不会上锁,更新数据的时候去判断一下,在此期间是否有人修改过这个数据,MySQL的version,在Redis中使用Watch;
获取version——更新的时候比较version;
unwatch取消监控(解锁)!
3、Redis监视测试
无变化,正常执行:

有变化,停止执行:


所以多线程修改值,使用watch可以当做乐观锁操作!
如果事务执行失败,就先解锁(unwatch),再加锁(watch,获取最新值再次进行监控);
















