SpringDataJPA的事务支持

SpringDataJPA

       Spring Data JPA 是Spring框架中用于简化数据访问层开发的模块,它提供了一种通过简单的注解方式来定义持久化数据操作的方式,而不需要编写复杂的JDBC或SQL代码。它是基于JPA(Java Persistence API)的标准规范实现,通过JPA提供的API来操作数据库。

     Spring Data JPA 提供了基本的CRUD(创建、读取、更新、删除)操作方法,并且还支持一些高级查询功能,如动态查询、分页查询、排序等。它还提供了一些特殊的特性,如延迟加载、事务管理等,可以大大简化开发人员对数据访问层的开发工作。

Spring Data JPA 的优点包括:

  • 简化了开发工作,通过注解方式定义数据操作,不需要编写冗长的SQL代码。
  • 提高了代码的可读性和可维护性,通过面向对象的方式操作数据,更符合开发人员的思维方式。
  • 提供了一些高级查询功能,减少了重复代码的编写。
  • 可以集成其他Spring框架的特性,如事务管理、安全认证等。
  • 可以与其他持久化框架(如Hibernate、MyBatis)无缝集成,提供更灵活的选择。

SpringDataJPA的事务支持

        Spring Data JPA的事务支持是指在使用Spring Data JPA操作数据库时,可以通过注解或编程的方式来管理数据库事务的提交和回滚。通过使用事务,可以保证数据的一致性和完整性。

具体来说,Spring Data JPA的事务支持包括以下几个方面:

  1. 注解方式:可以使用@Transactional注解来标注一个方法或类,表示该方法或类需要在一个事务中执行。当方法执行结束时,如果发生异常则会回滚事务,否则会提交事务。

  2. 编程方式:可以使用TransactionTemplatePlatformTransactionManager来编程式管理事务。通过调用TransactionTemplate的方法,可以在代码中控制事务的开始、提交和回滚。

  3. 事务传播行为:可以通过设置@Transactional注解的propagation属性来指定事务的传播行为。事务的传播行为包括REQUIREDREQUIRES_NEWNESTED等多种选项,用于定义在嵌套调用或多个事务方法之间的事务处理方式。

  4. 事务隔离级别:可以通过设置@Transactional注解的isolation属性来指定事务的隔离级别。事务的隔离级别包括READ_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE等多种选项,用于定义事务的并发控制策略。

       Spring Data JPA的事务支持可以帮助开发者简化数据库事务的管理,提高开发效率,并且确保数据库操作的一致性和完整性。

实例     

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    /**
     * 创建一个用户并保存到数据库
     * 使用默认的事务属性:
     *   - 事务传播级别:REQUIRED
     *   - 事务隔离级别:DEFAULT
     *   - 事务超时时间:使用默认值
     *   - 事务只读属性:false
     */
    @Transactional
    public void createUser(User user) {
        userRepository.save(user);
    }

    /**
     * 创建一个用户并保存到数据库
     * 使用指定的传播级别和只读属性:
     *   - 事务传播级别:REQUIRES_NEW
     *   - 只读属性:true
     */
    @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
    public void createUserReadOnly(User user) {
        userRepository.save(user);
    }

    /**
     * 更新用户信息
     * 如果抛出任何异常,则事务将回滚
     */
    @Transactional(rollbackFor = Exception.class)
    public void updateUser(User user) {
        user.setName("Updated");
        userRepository.save(user);
    }

    /**
     * 删除用户
     * 如果抛出指定类型的异常,则事务将回滚
     */
    @Transactional(rollbackFor = {IllegalArgumentException.class, NullPointerException.class})
    public void deleteUser(Long userId) {
        userRepository.deleteById(userId);
    }
}

上面的示例代码展示了在Spring Data JPA中使用事务的方法。在Spring中,事务管理是通过@Transactional注解实现的。这个注解可以应用在类级别或者方法级别上。

注解@Transactional可以用于以下几个方面:

  • 指定事务的传播级别:通过propagation属性设置,默认值为REQUIRED
  • 指定事务的隔离级别:通过isolation属性设置,默认值为DEFAULT
  • 指定事务的超时时间:通过timeout属性设置,默认值为使用底层事务管理器的默认值。
  • 指定事务的只读属性:通过readOnly属性设置,默认值为false
  • 指定事务回滚的异常类型:通过rollbackFor属性设置,默认值为空。

    在示例代码中,createUser方法使用默认的事务属性,将一个用户保存到数据库中。createUserReadOnly方法使用REQUIRES_NEW传播级别和只读属性为trueupdateUser方法在更新用户信息时,如果抛出任何异常,事务将回滚。deleteUser方法在删除用户时,如果抛出IllegalArgumentExceptionNullPointerException异常,事务将回滚。

总结       

    Spring Data JPA是一个用于简化数据访问层开发的框架,它整合了Spring和JPA,提供了一种便捷的方式来进行数据库操作。

    在Spring Data JPA中,事务是通过使用@Transactional注解来实现的。事务的支持是通过Spring的事务管理器来实现的,可以配置多种不同的事务管理器,如JpaTransactionManager、HibernateTransactionManager等。

   使用@Transactional注解可以将一个方法或类标记为一个事务。当一个方法被标记为事务时,Spring会自动为该方法创建一个事务,并在方法执行前开启事务,在方法执行完毕后提交事务。如果方法执行过程中抛出了异常,将会回滚事务。

事务注解的配置选项包括传播行为、隔离级别和只读模式:

  • 传播行为指定了当前方法与已存在事务的关系,如REQUIRED、REQUIRES_NEW、NESTED等。如果当前方法调用了其他方法,那么这些方法是否加入到事务中将由传播行为决定。

  • 隔离级别指定了事务的隔离级别,如DEFAULT、READ_COMMITTED、READ_UNCOMMITTED等。不同的隔离级别决定了事务并发访问数据库时的行为。

  • 只读模式指定了事务是否只读,只读事务可以优化性能,但不能进行修改操作。

    除了使用@Transactional注解来配置事务,还可以使用编程式事务管理,通过TransactionTemplate来管理事务。编程式事务管理可以更加灵活地控制事务的执行过程。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/597575.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

缓存菜品操作

一:问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大。 二:实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: 每个分…

k8s保持pod健康

存活探针 Kubemetes 可以通过存活探针 (liveness probe) 检查容器是否还在运行。可以为 pod 中的每个容器单独指定存活探针。如果探测失败,Kubemetes 将定期执行探针并重新启动容器。 Kubemetes 有以下三种探测容器的机制: HTTP GET 探针对容器的 IP 地…

Day61:单调栈 739. 每日温度 496.下一个更大元素 I

739. 每日温度 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例 1: 输…

发表博客之:gemm/threadblock/threadblock_swizzle.h 文件夹讲解,cutlass深入讲解

文章目录 [发表博客之:gemm/threadblock/threadblock_swizzle.h 文件夹讲解,cutlass深入讲解](https://cyj666.blog.csdn.net/article/details/138514145)先来看一下最简单的struct GemmIdentityThreadblockSwizzle结构体 发表博客之:gemm/th…

vue2 webpack-dev-server Unknown promise rejection reason

在vue.config.js中添加如下配置,重启项目即可 module.exports defineConfig({devServer: {client: {overlay: false,},} })参考

探索中位数快速排序算法:高效寻找数据集的中间值

在计算机科学领域,寻找数据集的中位数是一个常见而重要的问题。而快速排序算法作为一种高效的排序算法,可以被巧妙地利用来解决中位数查找的问题。本文将深入探讨中位数快速排序算法的原理、实现方法以及应用场景,带你领略这一寻找中间值的高…

vue 金额组件,输入提示单位:‘千’、‘万’、‘十万’...并用‘,’三个格式化

近期项目中遇到一个需求,金额输入框,输入过程中自动提示‘千’、‘万’、‘十万’、‘百万’......等单位提示,鼠标失去焦点后,并用‘,’三位隔开计数。 例如: 输入:12345.99 失去焦点:12,34…

Vue--》从零开始打造交互体验一流的电商平台(一)

今天开始使用 vue3 ts 搭建一个电商项目平台,因为文章会将项目的每处代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运行,希…

【Node.js工程师养成计划】之express中间件与接口规范

一、Express中间件的概念与基本应用 const express require(express)// 加一个注释,用以说明,本项目代码可以任意定制更改 const app express()const PORT process.env.PORT || 3000// // 挂载路由 // app.use(/api, router)// // 挂载统一处理服务端…

【倪亲斫经典水墨云纹仲尼式】倪诗韵亲斫古琴

【倪亲斫经典水墨云纹仲尼式】倪诗韵亲斫古琴 松透润,适合大曲文曲潇湘欸乃平沙,余韵悠长,手感极其舒适,久弹不疲。

[Linux][网络][TCP][三][超时重传][快速重传][SACK][D-SACK][滑动窗口]详细讲解

目录 1.超时重传1.什么是超时重传?2.超时时间是如何确定的? 2.快速重传3.SACK4.D-SACK1.ACK丢失2.网络延迟 5.滑动窗口0.问题抛出1.发送方的滑动窗口2.如何表示发送方的四个部分?3.接收方的滑动窗口4.滑动窗口的完善理解 1.超时重传 1.什么是…

C++手写协程项目(协程实现线程结构体、线程调度器定义,线程挂起函数、线程切换函数、线程恢复函数、线程结束函数、线程结束判断函数,模块测试)

协程结构体定义 之前我们使用linux下协程函数实现了线程切换,使用的是ucontext_t结构体,和基于这个结构体的四个函数。现在我们要用这些工具来实现我们自己的一个线程结构体,并实现线程调度和线程切换、挂起。 首先我们来实现以下线程结构体…

Splay 树简介

【Splay 树简介】 ● Treap 树解决平衡的办法是给每个结点加上一个随机的优先级,实现概率上的平衡。Splay 树直接用旋转调整树的形态,通过旋转改善树的平衡性。计算量小,效果好。 ● Splay 树的旋转主要分为“单旋”和“双旋”。 所谓“单旋”…

基于52单片机的AS608指纹密码锁电路原理图+源程序+PCB实物制作

目录 1、前言 2、实物图 3、PCB图 4、原理图 5、程序 资料下载地址:基于52单片机的AS608指纹密码锁电路原理图源程序PCB实物制作 1、前言 这是一个基于AS608STC89C52单片机的指纹识别和键盘密码锁。 里面包括程序,原理图,pcb图和实…

OpenNJet:云原生技术中的创新者与实践者

目录 引言OpenNJet介绍OpenNJet优势1. 性能无损动态配置2. 灵活的CoPilot框架3. 支持HTTP/34. 支持国密5. 企业级应用6. 高效安全 OpenNJet 编译与安装环境准备编译环境配置配置yum源yum 安装软件包创建符号连接修改 ld.so.conf 配置 编译代码 部署 WEB SERVER配置OpenNJet部署…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-13-按键实验

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

FTP协议与工作原理

一、FTP协议 FTP(FileTransferProtocol)文件传输协议:用于Internet上的控制文件的双向传输,是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同…

计算机网络【应用层】邮件和DNS

文章目录 电子邮件DNSDNS提供的服务:域名分级域名解析流程DNS资源记录DNS服务器类型 电子邮件 使用SMTP协议发送邮件之前,需要将二进制多媒体数据编码为ASCII码SMTP一般不使用中间邮件服务器发送邮件,如果收件服务器没开机,那么会…

解决jar包中没有主清单目录的问题

文章目录 解决jar包中没有主清单目录的问题问题描述环境描述方法一 | 阿里巴巴构造器的通用解决方案方式二 | 指定MANIFEST.MF路径 解决jar包中没有主清单目录的问题 问题描述 很简单可能很多人都遇到过,maven项目打成jar包后执行报错:jar包中没有主清单…

在模方中已经选好水岸线了,但是点处理瓦块的时候还是提示水岸线没选

答:能部分位置不闭合,双击右键闭合一下,可以强行闭合缺口。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能,支持…
最新文章