Redis 事务及 a Java 操作 s Redis 事务
1 、 什么是事务?
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。就
是把多件事情当做一件事情来处理,全部成功或者全部失败。
2 、 Redis 实现事务的 4 个重要命令
multi、exec、discard、watch(乐观锁)
3 、 Redis 实现事务
Redis 使用 multi 开启事务,通过 exec 提交事务,discard 用于回滚事务
事务回滚,数据无变化
[外链图片转存失败(img-ILfbbUpE-1566285146565)(C:\Users\ADMINI~1\AppData\Local\Temp\1566225859508.png)]
提交事务,数据进行更新
[外链图片转存失败(img-3hGhWC9e-1566285146569)(C:\Users\ADMINI~1\AppData\Local\Temp\1566225889886.png)]
事务中,错误的操作不会被执行,已经正确的操作会被执行,且不会回滚
[外链图片转存失败(img-pMrN9i4o-1566285146574)(C:\Users\ADMINI~1\AppData\Local\Temp\1566225911903.png)]
4 、 什么是悲观锁和乐观锁?
4.1、悲观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
4.2、乐观锁
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。
4.3、总结
适用于多读的应用类型,这样可以提高吞吐量。
4.3、总结
在实际生产环境里边,如果并发量不大且不允许脏读,可以使用悲观锁解决并发问题;但如果系统的并发非常大的话,悲观锁定会带来非常大的性能问题,所以我们就要选择乐观锁定的方法。两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行 retry 重复读取,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适