通过jedis再次理解事务和乐观锁

通过jedis再次理解事务和乐观锁,第1张

通过jedis再次理解事务和乐观锁

首先要知道,我们开启事务的命令是multi,在jedis *** 作中就是去jedis.multi,这样就得到了我们的事务的对象,我们事务中命令入队 *** 作,就是利用我们这个对象去调方法就可以了

 

其次我们要知道,事务的 *** 作如果失败了,是不是要回滚 *** 作啊,所以这种代码块都是要搭配

try catch finally 去进行 *** 作的:在finally中关闭客户端,如果抛异常了在catch中放弃事务,

我们先来显示下正常执行的事务 *** 作:

再来演示下事务有问题的情况:

首先说明一点,之前说过,事务执行异常有两种情况,一种是编译型异常,也就是我们的命令方法输入的有误,这样会导致事务中的命令都不会去执行,这种情况我们一般遇不到,因为在开发编写代码的时候,在开发工具上出现命令方法的错误,会直接爆红,或者是执行后会有提示

那就演示另一种异常情况:运行时异常 

可以看到,当我们在运行时遇到异常了,之前不是说过redis事务不具有原子性吗?当遇到异常时,其他命令还是可以执行成功的!但是这里的 int a = 1/0;之后的两个命令为什么不执行了?那就要注意这里是搭配了try catch finally来使用的,有异常所以直接就catch了,catch里面丢弃了事务,所以所有的命令都不会被执行

 

再把乐观锁加上演示一下:

首先注意一点:就是添加监控,即添加锁的 *** 作的代码必须要在启事务代码之前,否则会报错!

为了演示添加锁的 *** 作,我们首先要创建一个线程,这里使用继承Thread类的方式来创建,

 

首先在redis客户端set一个money,值为100

 

启动线程,线程任务开始是添加锁 *** 作,然后线程睡眠10秒钟。

在睡眠的过程中,在redis客户端更改money的值,set money 为1000,这样 *** 作的目的是:我们开始启动线程后,首先会监视money这个key,说白了就是给money上锁,当前上锁的money的值是100,这是上面我们之前就设置好的,然后在线程睡眠过程中,更改money的值为1000,这样就模拟了一个多线程并发执行的场景

 

接着开启事务了,事务里执行的 *** 作是先设置一个out,值为0,再给money减掉10块,再给out加上10块,然后执行事务,我们看下 执行的结果,第一个ok代表监控成功,接下来3个日志代表事务中那三个命令准备要打印的日志数据类型,这是什么意思呢?简单来说就是这里用了打印,但是这3个命令都没被执行,然后是执行事务的 *** 作日志,这里返回了一个null,说明watch告诉了这个事务,这个money值被变动了,当前的事务提交失败,接着就进入了finally,至于为啥不进catch,这是因为事务命令队列没有抛异常,都是正常的,错就错在并发场景,在finally中,我们可以看到money值是另一个线程设置的值,为1000,out值因为事务执行失败,所以就没有就为null

 

 我们可以再去redis客户端验证一下结果:可以看到没有问题

 

以上就是关于jedis来 *** 作事务,以及用jedis *** 作锁的用例!

哈酷酷么塔塔!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5697171.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存