Java外功精要(6)——Spring事务及其传播机制

Java外功精要(6)——Spring事务及其传播机制

1.概述

Spring事务管理是Spring框架中用于确保数据库操作 原子性、一致性、隔离性和持久性(ACID)
的核心机制。它通过声明式编程式(本文略)方式管理事务,支持多种事务传播行为和隔离级别相较于编程式事务,声明式事务通过@Transactional注解实现事务管理,无需手动编写事务代码事务基本概念在全面解析MySQL(5)——“索引、事务、JDBC”三大核心一文中有介绍,本文不再赘述

2.@Transactional

作用:提供声明式事务管理。它简化了在应用程序中管理数据库事务的流程。开发者只需在方法或类上添加此注解,Spring框架就会自动处理事务的开启、提交和回滚,无需手动编写事务管理代码(如 begin、commit、rollback)
级别:类 + 方法作为类注解:为类中所有public方法添加注解作为方法注解:默认仅对public方法生效
@RequestMapping("/test")@RestController@Slf4jpublicclassTestController{privatefinalUserService userService;@AutowiredpublicTestController(UserService userService){this.userService = userService;}@Transactional@RequestMapping("/test1")publicStringtest1(String userName,String password){UserInfo userInfo =newUserInfo(); userInfo.setUserName(userName); userInfo.setPassword(password);Integer result = userService.register(userInfo);if(result ==1){ log.info("test1注册成功,userName:{},password:{}", userName, password);}return"注册成功";}}
使用PostMan向后端发送请求:
MySQL查询结果如下:

后端日志日志如下:

2.1 rollbackfor

作用:指定哪些异常触发回滚,默认情况下在抛出 非受查异常(RuntimeException)/错误(Error) 时触发回滚

指定回滚类型

@RequestMapping("/test")@RestController@Slf4jpublicclassTestController{privatefinalUserService userService;@AutowiredpublicTestController(UserService userService){this.userService = userService;}@Transactional(rollbackFor =Exception.class)@RequestMapping("/test4")publicStringtest4(String userName,String password)throwsIOException{UserInfo userInfo =newUserInfo(); userInfo.setUserName(userName); userInfo.setPassword(password);Integer result = userService.register(userInfo);if(result ==1){ log.info("test4注册成功,userName:{},password:{}", userName, password);thrownewIOException();}return"注册成功";}}
使用PostMan向后端发送请求:
MySQL查询结果如下:

后端日志日志如下:

抛出非受查异常时

@RequestMapping("/test")@RestController@Slf4jpublicclassTestController{privatefinalUserService userService;@AutowiredpublicTestController(UserService userService){this.userService = userService;}@Transactional@RequestMapping("/test3")publicStringtest3(String userName,String password){UserInfo userInfo =newUserInfo(); userInfo.setUserName(userName); userInfo.setPassword(password);Integer result = userService.register(userInfo);if(result ==1){ log.info("test3注册成功,userName:{},password:{}", userName, password);thrownewRuntimeException();}return"注册成功";}}
使用PostMan向后端发送请求:
MySQL查询结果如下:

后端日志日志如下:

抛出受查异常时

@RequestMapping("/test")@RestController@Slf4jpublicclassTestController{privatefinalUserService userService;@AutowiredpublicTestController(UserService userService){this.userService = userService;}@Transactional@RequestMapping("/test2")publicStringtest2(String userName,String password)throwsIOException{UserInfo userInfo =newUserInfo(); userInfo.setUserName(userName); userInfo.setPassword(password);Integer result = userService.register(userInfo);if(result ==1){ log.info("test2注册成功,userName:{},password:{}", userName, password);thrownewIOException();}return"注册成功";}}
使用PostMan向后端发送请求:
MySQL查询结果如下:

后端日志日志如下:

2.2 isolation

作用:用于指定事务的隔离级别Isolation.DEFAULT:使用底层数据库默认的隔离级别Isolation.READ_UNCOMMITTED:读未提交Isolation.READ_COMMITTED:读已提交Isolation.REPEATABLE_READ:可重复读Isolation.SERIALIZABLE:串行化每种隔离级别的具体效果在全面解析MySQL(5)——“索引、事务、JDBC”三大核心一文中有介绍,本文不再赘述

2.3 propagation

作用:用于定义事务的传播行为,即当前事务方法被另一个事务方法调用时,事务应如何传播。Spring提供了7种传播行为,均基于Propagation枚举类实现

2.3.1 Propagation.REQUIRED

默认传播行为。如果当前存在事务,则加入该事务;如果不存在事务,则新建一个事务

2.3.2 Propagation.SUPPORTS

如果当前存在事务,则加入该事务;如果不存在事务,则以非事务方式执行

2.3.3 Propagation.MANDATORY

强制要求当前存在事务并加入,否则抛出异常

2.3.4 Propagation.REQUIRES_NEW

无论当前是否存在事务,都新建一个事务。新事务与当前事务独立,互不干扰

2.3.5 Propagation.NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,则挂起该事务

2.3.6 Propagation.NEVER

强制要求当前不能存在事务,否则抛出异常

2.3.7 Propagation.NESTED

如果当前存在事务,则在嵌套事务中执行;如果不存在事务,则行为与Propagation.REQUIRED相同。嵌套事务的回滚不影响外部事务,但外部事务回滚会导致嵌套事务回滚(适用于需要部分回滚的场景)

3.Gitee

Gitee地址:九转苍翎
本文源码:spring-trans

Read more

OpenClaw基础-3-telegram机器人配置与加入群聊

OpenClaw基础-3-telegram机器人配置与加入群聊 💡 大家好,我是可夫小子,《小白玩转ChatGPT》专栏作者,关注AI编程、AI自动化和自媒体。 Openclaw的优势是接入各种聊天工作,在前面的文章里,已经介绍了如何接入飞书。但之前我也提到了,飞书的最大的问题是请求多的限制,以及无法在非认证企业账号下面组建群聊。但这些限制另一个聊天工具可以打破,那就是Telegram,今天就跟大家分享一下,如果在OpenClaw里面接入Telegram。 第一步:Openclaw端配置 通过命令openclaw config,local→channels→telegrams 这里等待输入API Token,接下来我们去Telegram里面获取 第二步:Telegram端配置 1. 1. 在聊天窗口找到BotFather,打开对话与他私聊 2. 3. 然后再输入一个机器人,再输入一个账号名username,这里面要求以Bot或者Bot结尾,这个是全网的id,要 2. /newbot 来创建一个机器人,输入一个名字name

By Ne0inhk

openclaw飞书机器人权限管理

为了确保 OpenClaw 既能顺畅运行,又不至于因权限过大导致安全隐患,建议在飞书开发者后台 - 权限管理中,按照以下清单进行勾选。 这份清单分为基础必备和进阶功能两部分: 1. 基础必备权限(无论个人还是团队,必须开启) 这些权限保证机器人能“听到”指令并“开口”说话: * im:message:p2p_msg:readonly (接收单聊消息) —— 允许机器人和你 1 对 1 聊天。 * im:message:group_at_msg:readonly (接收群聊中@机器人的消息) —— 团队场景下,机器人只响应被 @ 的内容,保护群隐私。 * im:message.p2p_msg:send (发送单聊消息) —— 机器人回复你的基础。 * im:message.

By Ne0inhk

开箱即用的AI绘画工具:Z-Image-Turbo UI界面实测

开箱即用的AI绘画工具:Z-Image-Turbo UI界面实测 你是否试过下载一堆依赖、配置环境变量、反复调试端口,只为让一个AI绘图工具跑起来?又或者,刚点开网页就弹出“登录”“注册”“开通会员”,结果生成一张图要等三分钟,还带水印?今天要聊的这个工具,没有这些烦恼——它不联网、不传图、不注册,双击启动后,浏览器里输入一个地址,三秒进界面,五秒写提示词,十秒出高清图。它就是Z-Image-Turbo_UI界面镜像,一个真正意义上“开箱即用”的本地AI绘画方案。 这不是概念演示,也不是简化版Demo,而是完整可用的生产级UI:支持中文提示词理解、实时预览、多尺寸输出、历史图库管理,所有操作都在浏览器里完成,模型全程运行在你自己的设备上。接下来,我会带你从零开始,不跳步骤、不绕弯子,真实还原一次完整的使用过程——包括怎么启动、怎么调参、怎么保存、怎么清理,甚至怎么避开新手最容易踩的三个小坑。 1. 启动服务:

By Ne0inhk
Windows安装Neo4j保姆级教程(图文详解)

Windows安装Neo4j保姆级教程(图文详解)

文章目录 * 前言 * 系统要求 * 安装Java环境 * 步骤1:检查Java版本 * 步骤2:下载Java JDK * 步骤3:安装Java JDK * 下载Neo4j * 步骤1:访问官方网站下载Neo4j * 步骤2:解压Neo4j * 启动Neo4j服务 * 步骤1:以管理员身份打开命令提示符 * 步骤2:导航到Neo4j的bin目录 * 步骤3:安装Neo4j服务 * 步骤4:启动Neo4j服务 * 步骤5:验证服务状态 * 访问Neo4j * 基本操作和配置 * 常用管理命令 * 配置文件修改 * 常见问题解决 * 问题1:端口被占用 * 问题2:Java版本不匹配 * 问题3:服务启动失败 * 总结 前言 Neo4j是一款强大的图数据库,特别适合处理复杂的关系数据。本教程将手把手教你在Windows系统上安装Neo4j,并配置可视化工具,让你快速上手图数据库的世界。 系统要求 在开始安装之前,请确保你的系统满足以下要求: 操作系统:

By Ne0inhk