事务

10 分钟阅读 755 字 + 840 词
八、Redis的事务
1、概念
也是一组命令的集合。
事务会有三个步骤,开始事务、命令入队、执行事务。
2、事务的命令
==redis中的事务是没有原子性的。==
bash
#开启事务
multi

#提交事务
exec

#取消事务
discard

#监视命令
watch

#取消监视
unwatch
测试
bash
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> 
127.0.0.1:6379> lpush mylist 1 3 5 7 9
QUEUED
127.0.0.1:6379> get k3
QUEUED
127.0.0.1:6379> set k4 400
QUEUED
127.0.0.1:6379> exec
1) (integer) 5
2) "hello"
3) OK
127.0.0.1:6379>
image-20230704171355049
image-20230704172020686
3、悲观锁与乐观锁
1、悲观锁:顾名思义,就是很悲观,**每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,**当其他线程想要访问数据时,都需要阻塞挂起。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁、表锁,读锁,写锁等,都是在操作之前先上锁。linux互斥锁就是这种机制
2、乐观锁:【冲突检测和数据更新】
**乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是==在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。==**乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
乐观锁策略:提交版本必须大于记录当前版本才能执行更新,一般会使用版本号机制和CAS操作实现:
==version方式==:一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。 当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。
CAS(Check And Set【先检查再设置】)
==CAS操作方式==:即 Compare And Swap,CAS是乐观锁技术,涉及到三个操作数,数据所在的内存值V,预期值A,新值B。当需要更新时,判断当前内存值V与之前取到的值A是否相等, 若相等,则用新值更新,若失败则重试,一般情况下是一个自旋操作,即不断的重试。
两种锁各有优缺点,不可认为一种好于另一种,像 乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量 。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
4、事务的特性
  • 单独的隔离级别
  • 事务是串行执行的,天然保证了隔离性
  • 没有隔离级别的概念
  • 不保证原子性