首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SpringBoot事务管理:声明式事务和编程式事务。将Service层事务执行结果传递出去

SpringBoot中使用事务很简单,这一篇不是为了讲事务,主要是讲一下一个工具类,将需要加入事务Service层代码作为参数传递出去并返回事务执行结果(成功和回滚)。...编程式事务 在有些场景下,我们需要获取事务状态,是执行成功了还是失败回滚了,那么使用声明式事务就不够用了,需要编程式事务SpringBoot中,可以使用两种编程式事务。...如果出异常了,就执行isRollbackOnly方法进行回滚。感觉这个比较鸡肋,还不如注解事务方便,也不能把事务执行结果同步返回回去。...这个工具类作用是接收一个Service层需要被事务包围方法为参数,然后给调用端返回事务结果,供调用端根据结果做相应处理。...该工具是需要获取事务执行结果封装。

3.4K30
您找到你想要的搜索结果了吗?
是的
没有找到

Laravel中使用数据库事务以及捕获事务失败后异常

Description Laravel中要想在数据库事务中运行一组操作,则可以 DB facade 中使用 transaction 方法。如果在事务闭包内抛出异常,事务将会被自动还原。...你不需要担心使用 transaction 方法时还需要亲自去手动还原或提交事务: DB::transaction(function () { DB::table('users')->update...(['votes' => 1]); DB::table('posts')->delete(); }); 手动操作事务 如果你想手动处理事务并对还原或提交操作进行完全控制,则可以 DB facade...方法来提交这个事务: DB::commit(); 注意: DB facade 事务方法也可以用来控制 查询语句构造器 及 Eloquent ORM 事务。...: 考点知识点关联表 wiki_tag_rel 现在要开启事务新增Wiki数据,新增wiki成功后再把它关联到指定考点上去 (laravel中使用查询构建器或者Eloquent ORM执行query

1.3K40

来聊聊NoSql

按顺序启动后会看到如下运行结果: ? 运行结果 2、管道技术: 在说管道技术之前先说说TCP请求响应模型。 女朋友:你能给我解释一下什么是TCP么?...redis其实也是这种请求响应模型服务,客户端向服务端发送一个命令,等待服务端返回;服务端接收到命令进行执行,然后将结果返回给客户端。在这个回合中,服务端是接收不了其他命令。...使用管道就相当于可以并发处理,客户端不用等待服务端响应,继续发起下一个请求。 那么jedis如何使用管道技术呢?...watch相当于乐观锁,如果watchkey事务提交前被修改了,那么事务就会提交失败,得重新watch,获取到最新值(watch应该在事务开启之前)。 ?...watch 我开了两个窗口,watchk1初始值是100,然后事务中改成200,事务提交之前,另外一边将其改成了50,现在提交事务就会出现如下结果: ?

69430

Java面试集锦(一)之分布式

C:一致性(Consistency),事务一致性指的是一个事务执行之前执行之后数据库都必须处于一致性状态。 如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。...合理响应指的是系统应该明确返回结果并且结果是正确,这里正确指的是比如应该返回 50,而不是返回 40。 P (分区容错性):当出现网络分区后,系统能够继续工作。...反馈结果 参与者完成事务回滚之后,向协调者发送ACK消息 中断事务 协调者接收到参与者反馈ACK消息之后,执行事务中断。...第二阶段执行本地事务。 第三阶段通过第一阶段拿到地址去访问消息,并修改状态。消息接受者就能使用这个消息。 如果确认消息失败, RocketMQ Broker 中提供了定时扫描没有更新状态消息。...我们将应用拆分为分布式应用之前单机系统中,对一些并发场景读取公共资源时如扣库存,卖车票之类需求可以简单使用同步或者是加锁就可以实现。

23430

Redis 事务与锁

事务执行过程中,不会被其他客户端发送来命令请求所打断。 Redis 事务本质是一组命令集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。...事务执行过程,会按照顺序串行化执行队列中命令,其他客户端提交命令请求不会插入到事务执行命令序列中。 Redis 事务主要作用就是 串联多个命令 防止别的命令插队。...事务执行过程中,不会被其他客户端发送来命令请求所打断 没有隔离级别的概念 队列中命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行 不保证原子性 中如果有一条命令执行失败...,其后命令仍然会被执行,没有回滚 # 三大指令 开始事务指定 multi 执行事务指定 exec 执行事务前(exec),结束事务指令(理解为手动回滚) discard 从输入 Multi 命令开始...作用:执行 multi 之前,先执行 watch key1 [key2],可以监视一个(或多个) key ,如果在事务 exec 执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

34910

Redis事务深入解析和使用

作为关系型数据库中一项非常重要基础功能——事务 Redis 中是如何处理并使用?...,使用 multi 命令,客户端会返回结果 OK ,如果客户端已经是事务状态,再执行 multi 命令会 multi 命令不能嵌套错误,但不会终止客户端为事务状态,如下图所示: ?...从以上结果可以看出,即使事务队列中某个命令执行期间发生了错误,事务也会继续执行,直到事务队列中所有命令执行完成。...从 get k 结果也可以看出,事务中设置值 set k v2 并未正常执行执行流程如下图所示: ?...5.事务程序中使用 以下是事务 Java 中使用,代码如下: import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction

68810

Redis pipeline(12)原

常规连接客户端一般有3种请求方式: Client Pipeline 事务 三中模式区别 Client模式:就是客户端发送一个命令,阻塞等待服务端执行,然后读取返回结果。...每个请求命令发出后client通常会阻塞并等待redis服务器处理,redis处理完请求命令后会将结果通过响应报文返回给client,因此当执行多条命令时候都需要等待上一条命令执行完毕才能执行。...Jedis客户端中jedis-pipelineclient-buffer限制:8192bytes,客户端堆积命令超过8192bytes时,会发送给服务端。...如果Jedis发送了一组命令,而发送请求还没有结束,Redis响应结果会放在接收缓冲区。...如果接收缓冲区满了,jedis会通知rediswin=0,此时redis不会再发送结果jedis端,转而把响应结果保存在Redis服务端输出缓冲区中。

89820

Redis明明有事务,为什么大家更喜欢用lua脚本?

一、事务不回滚 比较事务与lua脚本之前,小义先带大家复习一下,为什么redis中事务失败时是不会进行回滚?...执行EXEC之前,如果有任何错误(比如命令语法错误或命令用错),Redis将立即停止并返回错误。...但是,如果EXEC命令执行后,执行队列中命令时出现错误,它并不会回滚之前已经执行成功命令,而是继续执行队列中其他命令。也就是说,Redis事务没有所谓“回滚”机制。...而Lua脚本则可以避免这种情况,所有命令同一Lua脚本中执行,从而保证数据执行过程中一致性。 3、减轻服务器压力:使用Redis内置事务功能,每个命令都需要进行网络通信,这会增加服务器压力。...首先,我们来看Redis事务一个使用例子: Jedis jedis = new Jedis("localhost"); //redis watch命令给事务提供check-and-set(CAS)机制

29910

Redis-09Redis基础事务

而 Redis 事务使用 MULTI-EXEC命令组合,使用它可以提供两个重要保证 : 事务是一个被隔离操作,事务方法都会被 Redis 进行序列化并按顺序执行事务执行过程中不会被其他客户端发生命令所打断...---- 如果回滚事务,则可以使用 discard 命令,它就会进入事务队列中命令,这样事务方法就不会被执行了,使用 discard 命令取消事务如下所示 127.0.0.1:6379> MULTI...使用 exec 后就会执行事务,行行完了事务后,执行 get 命令就能正常返回结果了。...需要再强调是 : 这里打印出来 value=null,是因为事务中,所有的方法都只会被 缓存到 Redis 事务队列中,而没有立即执行,所以返回为 null, 如果我们希望得到 Redis 执行事务各个命令结果...,可以用这行代码 : List list = ops.exec(); 这段代码将返回之前事务队列中所有命令执行结果,并保存在一个 List 中,只要在 SessionCallback 接口 execute

27910

缓存之Redis了解及使用

save时,只管保存,其他不管,全部阻塞; bgsave:Redis 会在后台异步执行快照操作,快照同时还可以响应客户端请求;可以通过lastsave命令获取最后一次成功执行快照时间...- EXEC: 执行所有事务块内命令; - DISCARD: 取消事务,放弃执行事务块内所有命令; - WATCH: 监控一个(或多个)key,如果在事务执行之前,这个(或这些)key...被其他命令所改动,那么事务将被打断; - UNWATCH: 取消WATCH命令对所有key监视; 特性: - 单独隔离操作:事务所有命令都会序列化,按顺序地执行;事务执行过程中...,不会被其他客户端发送来命令请求所打断; - 没有隔离级别的概念:队列中命令,没有提交之前不会实际执行,因为事务提交前任何指令都不会被实际执行,也就不存在"事务查询要看到事务更新...,事务外查询不能看到"这个让人万分头痛问题; - 不保证原子性:redis同一个事务中,如果有一条命令执行失败,其他命令仍然会被执行,没有回滚; 3.发布订阅 Redis 发布/订阅:进程间一种信息通信模式

50730

Redis“假事务”与分布式锁

事务具有四个特性: 一致性 原子性 隔离性 持久性 redis尽管提供了事务相关命令,但实际上它是一个“假事务”,因为它并不支持回滚,也就是说redis中一个事务有多个命令执行,并不能保证原子性...Redis中“假事务”(不保证原子性) redis中事务相关命令一共有以下几个: watch [key1] [key2]:监视一个或多个key,事务开始之前如果被监视key有改动,则事务被打断...watch监视key事务之前被改动,正常未被改动时情况,所有命令正常执行。...watch监视key,此时事务执行前key被改动,事务将取消不会执行所有命令。...,那就是不保证原子性,所以使用redis事务时,一定要谨慎。

66941

面试必备:虾皮服务端15连问

observable,返回一个Observable,只有订阅时才会执行Hystrix命令,可以返回多个结果 检查响应是否被缓存 如果启用了 Hystrix缓存,任务执行前将先判断是否有相同命令执行缓存...如果有则直接返回包含缓存响应Observable;如果没有缓存结果,但启动了缓存,将缓存本次执行结果以供后续使用。...返回执行结果 原始对象结果将以Observable形式返回,返回给用户之前,会根据调用方式不同做一些处理。 6....; 串行化:事务最高隔离级别,该级别下,所有事务都是进行串行化顺序执行。...,则说明你这个事务Read View生成之前就已经提交了,修改结果,当前事务是能看见

55451

Redis分布式锁10个坑

忘记设置过期时间 之前review代码时候,看到这样实现分布式锁,伪代码: try{ if(jedis.setnx(lock_key,lock_value) == 1){//加锁 doBusiness...,使用了Redis分布式锁.这个方法一旦执行,事务生效,接着就Redis分布式锁生效,代码执行完后,先释放Redis分布式锁,然后再提交事务数据,最后事务结束。...在这个过程中,事务没有提交之前,分布式锁已经被释放,导致分布式锁失效 这是因为: springAop,会在updateDB方法之前开启事务,之后再加锁,当锁住代码执行完成后,再提交事务,因此锁住代码块执行事务之内执行...,可以推断代码块执行完时,事务还未提交,锁已经被释放,此时其他线程拿到锁之后进行锁住代码块,读取库存数据不是最新。...正确实现方法,可以updateDB方法之前就上锁,即还没有开事务之前就加锁,那么就可以保证线程安全性. 9.锁可重入 前面讨论Redis分布式锁,都是不可重入

98020

Redis---事务

事务执行过程中,不会被其他客户端发送来命令请求所打断。...Redis就是利用这种check-and-set机制实现事务 ---- 乐观锁在Redis中应用 WATCH key [key …] 命令 执行multi之前,先执行watch key1 [key2...],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。...事务执行过程中,不会被其他客户端发送来命令请求所打断。...没有隔离级别的概念 队列中命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行 不保证原子性 事务中如果有一条命令执行失败,其后命令仍然会被执行,没有回滚 ---- Redis

70120

Redis是怎么对缓存下手

当Redis重启时,它会从磁盘中加载最新RDB文件,并使用其中数据集来恢复之前状态。...事务支持 Redis支持原子性操作,可以将多个命令打包成一个事务执行时保证所有命令都成功或全部失败。这种支持非常适用于需要进行多个操作复杂应用程序。...事务概念 Redis事务是一系列命令集合,可以像单个命令一样执行执行期间,所有其他客户端请求都被暂停,直到该事务完成。 2....事务操作 Redis事务操作分为以下步骤: 开启一个事务使用multi()方法。- 执行一系列命令,如字符串、哈希、列表等类型数据操作。- 提交事务执行所有操作,使用exec()方法。...然后,我们通过调用eval()方法来执行该脚本,并将结果存储变量“value”中。 3. Lua脚本参数 除了键名称之外,Lua脚本还可以接受其他参数。

7310

【1w字+干货】第一篇,基础:让你 Redis 不再只是安装吃灰到卸载(Linux环境)

:Redis 事务本质是一组命令集合 事务支持一次执行多个命令,一个事务中所有命令都会被序列化 事务执行过程,会按照顺序串行化执行队列中命令,其他客户端提交命令请求不会插入到事务执行命令序列中...,而类型错误是执行时检测,Redis为提升性能而采用这种简单事务 (3) 事务没有隔离级别的概念 批量操作发送 EXEC 命令前被放入队列缓存,并不会被实际执行,也就不存在事务查询要看到事务更新...,所以第二点一起演示示例 (2) 执行事务 含义:执行事务所有操作 命令:exec A:正常开启且执行一个事务 首先先存一个 k1 和 k2,开启事务后,对这两个值进行修改,然后将这个事务执行,最后发现两个...做法就是, multi 之前先用 watch 监控某些键值对,然后继续开启以及执行事务 如果 exec 执行事务时,这些被监控键值对没发生改变,它会执行事务队列中命令 如果 exec 执行事务时...,被监控键值对发生了变化,则将不会执行事务任何命令,然后取消事务操作 我们监控 k1,然后再事务开启之前修改了 k1,又想在事务中修改 k1 ,可以看到最后结果中,事务操作就都没有执行

63210

Redis乐观锁实现一个秒杀系统

即为数据增加一个版本标识,基于数据库表版本解决方案中,一般是通过为数据库表增加一个”version”字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1。...redis中可以使用watch命令会监视给定key,当exec时候如果监视key从调用watch后发生过变化,则整个事务会失败。 也可以调用watch多次监视多个key。...这样就可以对指定key加乐观锁了。注意watchkey是对整个连接有效事务也一样。如果连接断开,监视和事务都会被自动清除。...事务同命令一样都是Redis最小执行单位,一个事务命令要么都执行,要么都不执行。...Redis事务是下面4个命令来实现 1.multi,开启Redis事务,置客户端为事务态。 2.exec,提交事务执行从multi到此命令前命令队列,置客户端为非事务态。

65130
领券