Java项目中使用事务

news2024/11/26 7:45:18

事务的四大特性

事务特性ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

  • 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚.
  • 一致性是指一个事务执行之前和执行之后都必须处于一致性状态。比如a与b账户共有1000块,两人之间转账之后无论成功还是失败,它们的账户总和还是1000。
  • 隔离性。跟隔离级别相关,如read committed,一个事务只能读到已经提交的修改。
  • 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

事务隔离级别有哪些?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

需求:注册一个用户,系统自动为他发一个帖子“新人报道”

在这里插入图片描述

声明式事务

在Java中,声明式事务是通过注解或XML配置的方式来实现的,主要用于管理方法或类的事务处理。Spring框架是Java中最常用的实现声明式事务的工具之一。以下是声明式事务在Java中的一般实现方式:

使用Spring框架:Spring框架提供了声明式事务管理的支持。通过在方法上添加@Transactional注解,可以将方法声明为一个事务性方法。Spring会在运行时基于这些注解来管理事务的开启、提交、回滚等操作。

import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Autowired
    private MyRepository repository;

    @Transactional
    public void myTransactionalMethod() {
        // 执行数据库操作
        repository.save(entity);

		//主动加错看事务是否回滚,因为事务保证原子性,有错误会把上面的操作也撤回
    	Integer.valueOf("abc");    }
}

编程式事务

使用Spring的TransactionTemplate是在Java中实现编程式事务的一种便捷方式。它封装了事务管理的细节,简化了事务处理的代码,同时提供了更加灵活的事务控制。

  • transactionTemplate.setIsolationLevel:设置隔离级别

  • transactionTemplate.setPropagationBehavior:设置传播级别

  • 调用方法 execute匿名实现接口TransactionCallback,回调方法

public Object save2() {
//创建TransactionTemplate对象
    transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
    transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    
	//使用TransactionTemplate执行事务
    return transactionTemplate.execute(new TransactionCallback<Object>() {
        @Override
        public Object doInTransaction(TransactionStatus status) {
            // 新增用户
            User user = new User();
            user.setUsername("beta");
            user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
            user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
            user.setEmail("beta@qq.com");
            user.setHeaderUrl("http://image.nowcoder.com/head/999t.png");
            user.setCreateTime(new Date());
            userMapper.insertUser(user);

            // 新增帖子
            DiscussPost post = new DiscussPost();
            post.setUserId(user.getId());
            post.setTitle("你好");
            post.setContent("我是新人!");
            post.setCreateTime(new Date());
            discussPostMapper.insertDiscussPost(post);

            Integer.valueOf("abc");

            return "ok";
        }
    });
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#体检中心源码,C/S架构的健康体检系统源码,三级综合医院应用案例

健康体检管理系统源码&#xff0c;C#体检中心源码&#xff0c;三级医院应用案例。 智慧健康体检管理系统是为体检中心服务的&#xff0c;帮助体检机构实现业务市场开拓&#xff0c;实现检前、检中、检后全过程的体检健康管理。检前微信平台/网络预约登记、收费&#xff0c;检中…

Windows下docker-compose部署DolphinScheduler

参照&#xff1a;快速上手 - Docker部署(Docker) - 《Apache DolphinScheduler v3.1.0 使用手册》 - 书栈网 BookStack 下载源文件 地址&#xff1a;https://dolphinscheduler.apache.org/zh-cn/download/3.2.1 解压到指定目录&#xff0c;进入apache-dolphinscheduler-xxx-…

排序:冒泡排序,直接插入排序,简单选择排序,希尔排序,快速排序,堆排序,二路归并排序

目录 一.冒泡排序 代码如下 冒泡排序时间复杂度分析 二.直接插入排序 直接插入排序时间复杂度分析 直接插入排序优化&#xff1a;折半插入排序 三.简单选择排序 简单选择排序优化&#xff1a;双向选择排序 选择排序时间复杂度 双向选择排序时间复杂度 四.希尔排序 希…

winfrom入门篇4 -- 添加控件

添加控件 打开工具箱 在公共控件中&#xff0c;选择Button 直接拖动到窗体中 运行程序 此时查看Form1.Designer.cs 在InitializeCompent() 方法中自动生成了button 相关代码 同时添加了一个button1 字段 右键按钮选择属性&#xff0c;查看属性栏 改变Text 属性 此时在观…

Excel文本内容抽取工具[Python]

#创作灵感# 一堆Excel文件&#xff0c;每个打开看太累了。写个脚本直接显示里面的内容多好。最好这些内容可以直接复制到剪切板&#xff0c;方便以后编辑修改。只需要将文件拖动到全屏置顶的文本框内&#xff0c;就能弹出Excel里的内容。支持一次选取多个文件。 开干&#xff…

快速入门Kotlin④集合

集合概述 继承关系(List、Set和Map均继承了Collection) List List 是一个接口,用于表示列表(List)数据结构。它是一个有序的集合,允许重复元素。 listOf 创建的列表是不可变的,而 mutableListOf 创建的列表是可变的,允许对其进行添加、删除和更新操作。 fun main()…

电脑实时监控软件分享|五个好用的实时屏幕监控软件

电脑实时监控软件是一种专门设计用于实时监控和记录电脑用户操作行为、系统状态以及网络活动的软件工具。 这类软件主要服务于企业、教育机构、家庭或个人用户&#xff0c;用于确保网络安全、提升工作效率、监督员工行为、保护儿童在线安全、防止数据泄露等多种目的。 针对企业…

蓝桥ROS云课一键配置f1tenth和PID绕圈(竞赛更新版)

准备资料 竞赛说明&#xff1a; ROS机器人虚拟仿真挑战赛学习笔记 之前版本&#xff1a; 蓝桥ROS云课→一键配置←f1tenth和PID绕圈 修改定制 提高调试效率&#xff0c;非常关键^_^ 配置文件&#xff1a; echo "Upgrade Mission Begins."echo "-----BEGI…

用AI作图,使用这个免费网站,快看我画的大鹏鸟和美女

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

【获取 etc passwd文件后的入侵方式】_ etc passwd 通过浏览器对外暴露

获取到/etc/passwd文件对于黑客来说可能是一个有价值的信息来源&#xff0c;因为这个文件通常包含了Linux系统中所有用户的信息&#xff08;用户名、用户ID等&#xff09;。然而&#xff0c;这个文件并不包含用户的密码&#xff0c;密码信息通常存储在/etc/shadow文件中。尽管如…

swiftUI macOS使用webview加载外部网址

import SwiftUI import WebKitstruct ContentView: View {var body: some View {VStack {Text("测试")WebView(urlString: "https://aweb123.com").frame(maxWidth: .infinity, maxHeight: .infinity) // 让 WebView 占据整个可用空间}.frame(minWidth: 20…

CSS层叠样式表学习(基础选择器)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS&#xff08;2&#xff09;的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 二、CSS基础选择器 2.1 CSS选择器的作用 2.2 选择器分类 2.3 标签选择器 2.…

C++入门 (2) >>引用>>内联函数>>auto关键字

1 引用 定义&#xff1a;给变量起别名。 方法&#xff1a;在类型后面加上&符号。 主要作用&#xff1a;代替函数传指针。 例&#xff1a; void test(int& a) //参数为int&类型 {a 10; }int main() {int m 3;int& z m; //给m起别名叫z&#xff0…

自定义类型:结构体,位端

结构体内存对齐 结构体的对齐规则&#xff1a; 1. 第一个成员在与结构体变量偏移量为0的地址处。 2. 其他成员变量要对齐到某个数字&#xff08;对齐数&#xff09;的整数倍的地址处。 对齐数 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8 Linux中没有默…

【资源分享】Adobe Ai矢量插图软件免费下载安装

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

【Qt】文件与音视频

目录 一、输入输出设备类 二、文件读写类 三、文件和目录信息类 四、音视频 4.1 音频 4.2 视频 文件操作是应用程序必不可少的部分。Qt作为一个通用开发库&#xff0c;提供了跨平台的文件操作能力。Qt提供了很多关于文件的类&#xff0c;通过这些类能够对文件系统进行操作…

JavaScript保姆级详细教程

目录 JavaScript的学习思路可以按照以下步骤进行&#xff1a; 函数定义&#xff1a; avaScript 中常见的一些方法和函数的分类及示例 1. 内置函数 (Built-in Functions) 2. 自定义函数 (Custom Functions) 3. 方法 (Methods) 4. 回调函数 (Callbacks) 5. 箭头函数 (Arrow…

openhomeny鸿蒙调用so示例(亲测有效)

分2个步骤说明: 1、创建C++和编译so 2、在新项目如何引用so并调用对应的api ===================》 1.1、创建C++工程 打开devecostudio,找到菜单File=》Create Project 1.2、选择Native C++,点击Next 1.3、选择默认,点击Finish,等待项目编译完成,结构如下: 1.4、 c…

Vue2 —— 学习(一)

目录 一、了解 Vue &#xff08;一&#xff09;介绍 &#xff08;二&#xff09;Vue 特点 &#xff08;三&#xff09;Vue 网站 1.学习&#xff1a; 2.生态系统&#xff1a; 3.团队 二、搭建 Vue 开发环境 &#xff08;一&#xff09;安装与引入 Vue 1.直接引入 2.N…

Burp练兵场之通过加密语言机绕过身份验证(思路鉴赏)

前言 之前有一段时间在玩Burp的靶场&#xff0c;感觉还不错&#xff0c;总体排名也冲到了top30 靶场地址 → https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-authentication-bypass-via-encryption-oracle 通过加密预言机绕过身份验证 靶场信息…