Java使用分布式锁来做数据库事务控制

步骤如下:

1)选择合适的分布式锁实现:常见的分布式锁实现包括ZooKeeper、Redis和基于数据库等。根据具体情况选择最佳方案。

2)获取分布式锁:在需要进行操作时,首先尝试获取分布式锁。如果成功获取到,则可以执行相应操作;否则说明已经有其他客户端正在处理该请求,此时可以直接返回或者等待一段时间后再次尝试。

3)执行业务逻辑:在获得了分布式锁之后,即可执行相应业务逻辑。例如,在数据库事务场景中可以开启一个新的事务,并将其与当前线程绑定。

4)提交或回滚事务:在完成所有操作之后,必须及时提交或回滚当前线程所关联的事务,并释放占用的资源(包括数据库连接、文件句柄等)以及释放所持有的分布式锁。

以下是一个简单示例代码演示如何使用Java实现基本的数据库事务控制功能:

public class TransactionManager {private static final String LOCK_KEY = "transaction_lock";// Redisson客户端private RedissonClient redisson;// 初始化方法,在系统启动时执行public void init() throws Exception {Config config = new Config();
        config.useSingleServer().setAddress("redis://localhost:6379");
        redisson = Redisson.create(config);System.out.println("TransactionManager initialized.");}// 处理POST请求@PostMapping("/api")public String api(@RequestParam("data") String data){RLock lock = redisson.getLock(LOCK_KEY);Connection conn=null;try{if(lock.tryLock()){
                 conn=getConnectionFromPool();   从连接池中获取conn对象  
                 conn.setAutoCommit(false);      关闭自动提交模型 saveDataToDatabase(conn,data);                  conn.commit();                  提交当前关联到这个连接上面去并且未被显性地回滚过任何更改。}else{throw new RuntimeException("无法获得全局互斥访问权!");}}catch(Exception ex){if(conn != null) { try{    
                    conn.rollback();              回滚所有未提交更改。}catch(SQLException e){}   }throw new RuntimeException(ex.getMessage(),ex);}finally{closeConnection(conn);               归还conn对象给连接池 
            lock.unlock();}}// 将数据保存到指定表格里面去private void saveDataToDatabase(Connection conn, String data){PreparedStatement stmt=null;try{    
              stmt=conn.prepareStatement("INSERT INTO my_table (data, status) VALUES (?, ?)");
              stmt.setString(1,data);
              stmt.setString(2,"active");int rowsAffected=stmt.executeUpdate();}catch(SQLException ex){throw new RuntimeException(ex.getMessage(),ex);}finally{closeStatement(stmt); 关闭语句对象  }}}

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

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

相关文章

严蔚敏数据结构(C语言版)吴伟民宁编著清华大学计算机系列教材+题集+配套题库+笔记+习题PDF电子版

今天分享的是 严蔚敏数据结构(C语言版)题集配套题库笔记习题PDF电子版 注:本资源搜集于网络,仅供学习交流,严禁用于商业用途 内容简介: “数据结构”是计算机程序设计的重要理论技术基础,它…

ArcTs布局入门04——相对布局 媒体查询

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧 扫描下面的二维码关注公众号。 本文将探讨相对布局与媒体查询,为啥把他们放到一起呢?主要是因为相对布局在响应式的场景下做得不太好,一般情况下和媒体查询(不同尺…

MySQL之备份与恢复(二)

备份与恢复 定义恢复需求 如果一切正常,那么永远也不需要考虑恢复。但是,一旦需要恢复,只有世界上最好的备份系统是没用的,还需要一个强大的恢复系统。 不幸的是,让备份系统平滑工作比构造良好的恢复过程和工具更容易…

OCR是什么,主要应用和未来发展趋势

OCR,即光学字符识别(Optical Character Recognition),是一种能够将图像文件中的文字资料转化为电子文本的技术。它广泛应用于数字化文档管理、自动化数据录入、智能识别等多个领域,涉及的主要技术包括图像预处理、特征…

【NBU大三下期末考试实录】

软件测试 任课老师:WXH,形式:开卷(中文试卷,可携带中文书籍) 复习建议:由于是开卷考,不需要过早复习,建议考前照着上课的PPT复习,大致有个概念即可&#xff…

WebRtc实现1V1音视频通话

WebRtc实现1V1音视频通话 简介应用场景共享桌面的基本原理传统共享桌面WebRTC 共享桌面 相关API基本使用调用本地摄像头播放约束设置 媒体协商过程协议协议的交换与传输 WebRTC 通信过程ICE Candidate(ICE 候选者) 1V1视频通话 简介 WebRTC,名…

新版本发布丨昂辉科技EasySAR-Configurator V1.2.0再启航

昂辉科技新一代跨平台高性能AUTOSAR配置工具EasySAR-Configurator V1.2.0全新版本重磅发布!产品基于Web架构前后端分离的方式开发,可提供SaaS部署,能够实现精准配置和最大限度的代码裁剪,且配备标准的约束限制、配置验证、代码生成…

thinkphp6 亚马逊S3存储

在ThinkPHP6中使用亚马逊S3作为存储需要使用一个适合的库来与S3接口交互。这里我们可以使用league/flysystem-aws-s3-v3库来实现 composer require league/flysystem-aws-s3-v3 aws/aws-sdk-php然后,在ThinkPHP6中配置S3存储驱动。在config目录下创建一个新的配置…

jenkins 发布服务到linux服务器

1.环境准备 1.1 需要一台已经部署了jenkins的服务器,上面已经集成好了,jdk、maven、nodejs、git等基础的服务。 1.2 需要安装插件 pusblish over ssh 1.3 准备一台额外的linux服务器,安装好jdk 2.流程描述 2.1 配置jenkins,包括p…

java函数式接口的使用-自定义函数接口@FunctionalInterface消除if else和内置4大函数式接口

1.自定义函数接口FunctionalInterface消除if else FunctionalInterface public interface MyFunction<T, R> {R apply(T... t); }import com.google.common.collect.Maps;import java.util.Map;/*** 自定义函数消除if else*/ public class MyFunctionTest {//(自定义)一…

ubuntu系统下如何安装python

在Ubuntu系统下安装Python&#xff0c;有多种方法可供选择。以下是两种常见的方法&#xff1a; 一、使用apt包管理器安装 安装步骤如下&#xff1a; 首先更新软件包列表 sudo apt update安装Python 3&#xff1a; 输入以下命令以安装Python 3&#xff08;Ubuntu的默认Pyth…

如何将 Apifox 的自动化测试与 Jenkins 集成?

CI/CD &#xff08;持续集成/持续交付&#xff09; 在 API 测试 中的主要目的是为了自动化 API 的验证流程&#xff0c;确保 API 发布到生产环境前的可用性。通过持续集成&#xff0c;我们可以在 API 定义变更时自动执行功能测试&#xff0c;以及时发现潜在问题。 Apifox 支持…

二叉树的最近公共祖先-二叉树

236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; ​ 递归 lson、rson左右子树&#xff1b; 深度优先遍历&#xff0c;遍历到p或者q就返回ture&#xff1b; class Solution { public:TreeNode* ans;bool dfs(TreeNode* root, TreeNode* p, TreeNode* q){i…

墨烯的C语言技术栈-C语言基础-004

三.变量,常量 生活中有些值是不变的 有些值是可变的 // 变量和常量功能 // 变量分为 局部变量 和 全局变量 int b 20; 全局变量 int main() { short age 20; // 年龄 局部变量 int high 180; // 身高 局部变量 float weight 88.5 // 体重 局部变量 return 0;…

GoLand 2024 for Mac GO语言集成开发工具环境

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

CAN学习笔记

学习链接&#xff1a;CAN学习笔记&#xff08;1&#xff09;_can sjw-CSDN博客 内容全部取自链接&#xff0c;非原创。用于自己学习和记录&#xff0c;如有错误请指正。如果侵权了&#xff0c;请联系我删掉。 CAN主要有两种物理层&#xff0c;1.闭环的ISO11898 2.开环的ISO1…

Hadoop3:NameNode和DataNode多目录配置(扩充磁盘的技术支持)

一、NameNode多目录 1、说明 NameNode多目录&#xff0c;需要在刚搭建Hadoop集群的时候&#xff0c;就配置好 因为&#xff0c;配置这个&#xff0c;需要格式化NameNode 所以&#xff0c;如果一开始没配置NameNode多目录&#xff0c;后面&#xff0c;就不要配置了。 2、配置…

数据库组成及原理

属性&#xff1a; 把数据库中的一个表类比成一个公司&#xff0c;那么公司里的每个人都是一个“属性”&#xff08;表中的一个字段视为一个属性&#xff09;&#xff0c;不管老板还是员工&#xff0c;只要是公司里的人&#xff0c;就都是一个属性。 主键&#xff1a; 老板就是“…

网络安全 文件上传漏洞-20 第二十关 Pass-20

点击进入第二十关&#xff0c;并选择显示代码&#xff1a; $is_upload false; $msg null; if(!empty($_FILES[upload_file])){//检查MIME$allow_type array(image/jpeg,image/png,image/gif);if(!in_array($_FILES[upload_file][type],$allow_type)){$msg "禁止上传该…

vector模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityopera…