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

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

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

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

    在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相当于乐观锁,如果watch的key在事务提交前被修改了,那么事务就会提交失败,得重新watch,获取到最新值(watch应该在事务开启之前)。 ?...watch 我开了两个窗口,watch的k1初始值是100,然后在事务中改成200,在事务提交之前,另外一边将其改成了50,现在提交事务就会出现如下结果: ?

    81330

    Redis 事务与锁

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

    39210

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

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

    25930

    Redis事务深入解析和使用

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

    72510

    Redis pipeline(12)原

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

    95720

    深入探索Java开发世界:Redis~类型分析大揭秘

    缺点:存在死锁问题,因为如果持有锁的客户端在执行完业务逻辑之前出现异常或者宕机,锁将永远得不到释放。...在操作某个键之前,先通过WATCH命令监视该键,如果在执行事务期间该键的值被修改,则事务执行失败。可以利用这个特性实现乐观锁来保证并发操作的一致性。...// 在事务中,命令并不会立即执行,而是放入队列中等待exec()命令执行 transaction.exec(); // 获取执行结果...在Redis事务中,如果某个命令执行失败,后续的命令仍然会继续执行,而不会回滚到事务开始之前的状态,对于强一致性要求较高的场景,Redis事务可能不适用。...使用场景:简单的读写操作:避免复杂的并发控制需求,确保单一客户端在事务期间的数据操作不被其他客户端干扰。确保顺序性:在需要严格顺序执行的操作场景下,事务提供了一种方便的实现方式。

    9710

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

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

    1.2K10

    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

    32010

    【Redis】007-通过Jedis操作Redis、通过Jedis进行事务操作、Spring Boot整合Redis

    一、通过Jedis操作Redis 1、什么是Jedis 使用Java操作Redis,Jedis是Redis官方推荐的Java连接开发工具; 2、Jedis使用 第一步:创建一个空项目,并创建一个普通的Maven...Jedis jedis = new Jedis("127.0.0.1", 6379); //Jedis的所有命令就是之前学的redis指令 System.out.println...(jedis.ping()); } } 启动redis服务: 运行测试: 3、备注 其他命令不再演示,跟之前的一样; 二、通过Jedis进行事务操作 1、代码 package com.zibo;...", result); // 执行事务 multi.exec(); }catch (Exception e){ /...} } } 2、运行结果 三、Spring Boot整合Redis 之前写过,笔记见https://blog.csdn.net/qq_29689343/article/details

    14210

    缓存之Redis了解及使用

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

    52930

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

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

    63151

    Redis的“假事务”与分布式锁

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

    69441

    Redis分布式锁的10个坑

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

    1.4K20

    Redis是怎么对缓存下手的

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

    8810

    Redis---事务篇

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

    78320

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

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

    84310
    领券