Redis-9、事务

事务的四大原则:ACID

ACID原则:

1、原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

2、一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。举例来说,假设用户A和用户B两者的钱加起来一共是1000,那么不管A和B之间如何转账、转几次账,事务结束后两个用户的钱相加起来应该还得是1000,这就是事务的一致性。

3、隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

4、持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务已经正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成。否则的话就会造成我们虽然看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。这是不允许的。

Redis对于事务的注意事项

1、Redis事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务的执行过程中,会按照顺序执行!

2、Redis事务有三大特性:一次性、顺序性、排他性!

3、Redis单条命令是保证原子性的,但是事物不保证原子性!

4、Redis没有隔离级别的概念,所有的命令在事物中并没有直接被执行,只有发起执行命令的时候才会执行!

5、Redis的事务分为三个阶段:开启事物、命令入队、执行事物

一次简单的事务执行

127.0.0.1:6379> multi # 开启事物
OK

# 命令入队
127.0.0.1:6379> set name zhangsan
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> set email xxx.qq.com
QUEUED

127.0.0.1:6379> exec # 执行事物
1) OK
2) OK
3) OK

放弃事务命令:discard,事务队列中的命令都不会被执行

Redis对于事务中错误的处理

1、编译时异常,事务不会被执行

127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379> set name zhangsan
QUEUED
127.0.0.1:6379> set age # 错误命令,没有设置value
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set email xxx.qq.com
QUEUED
127.0.0.1:6379> exec # 提交事务之后提示错误,命令队列不会被执行
(error) EXECABORT Transaction discarded because of previous errors.

2、运行时异常,事务可以被正常执行,这里就会提现出Redis事务不能保证原子性

127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379> set name zhangsan
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> set email xxx.qq.com
QUEUED
127.0.0.1:6379> incr name # 错误命令,不能对非数字型字符自增
QUEUED
127.0.0.1:6379> get name
QUEUED
127.0.0.1:6379> exec # 提交事务,可以看到事务可以被正常执行,错误并不能中断事务,非原子
1) OK
2) OK
3) OK
4) (error) ERR value is not an integer or out of range
5) "zhangsan"

监控!Watch

悲观锁:认为什么时候都会出现问题,无论做什么都上锁

乐观锁:认为什么时候都不会出现问题,所以不会上锁,更新数据的时候去判断一下,在此期间是否有人修改这个数据『version』

使用watch相当于一个乐观锁的操作,可以监视一个key,如果线程执行之前又另外一个线程修改了这个可以,这个时候就会导致事物执行失败,返回nil

注意:watch key 之后,如果事物执行成功,watch则自动取消监视,如果事物执行失败了,则需要手动放弃监视『unwatch』然后再重新开启监视

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值