数据库事务管理

news/2024/4/20 18:05:15/文章来源:https://blog.csdn.net/weixin_68683361/article/details/130121219

在关系型数据库中,事务的实现通常采用“日志”(Log)技术。当一个事务开始时,系统将对所有需要修改的数据进行备份,并在内存缓冲区中维护一个日志记录。这些修改操作仅在事务提交时才被写回到磁盘上的数据库文件中,从而保证原始数据不会受到破坏。

如果事务执行过程中发生错误,例如系统崩溃、断电等,导致事务无法正常结束,则系统可以通过读取日志记录来恢复数据。具体步骤如下:

  1. 读取日志:系统首先会读取所有已经提交但还未写入磁盘的事务日志,并将其应用到数据库文件中,以恢复最新的数据状态。

  2. 恢复数据库:接下来,系统会根据日志中的操作记录,逆序地执行每个操作,并将其结果应用到数据库文件中,从而使数据库恢复到事务提交前的状态。

  3. 清空日志:一旦数据成功恢复,系统会将所有已经提交的事务日志清空,以准备下一次操作。

需要注意的是,由于事务日志需要占用额外的磁盘空间和系统资源,因此在设计系统时需要权衡日志文件大小和性能要求之间的平衡。

1.0首先需要安装 MySQL 的 Java 驱动程序,可以从官网下载相应版本的驱动文件,然后将其添加到项目类路径中。

接下来,我们连接数据库并创建一个新的表:

import java.sql.*;public class Main {public static void main(String[] args) {Connection conn = null;Statement stmt = null;try {// 连接数据库conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase", "username", "password");// 创建新表stmt = conn.createStatement();String createTableQuery = "CREATE TABLE customers (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), address VARCHAR(255))";stmt.executeUpdate(createTableQuery);} catch (SQLException e) {e.printStackTrace();} finally {// 关闭资源try {if (stmt != null) stmt.close();if (conn != null) conn.close();} catch (SQLException ex) {ex.printStackTrace();}}}
}

2.0现在我们已经创建了一个 customers 表。接下来,我们将向该表插入两行数据,并将这些操作封装在一个事务中:

import java.sql.*;public class Main {public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt = null;try {// 连接数据库conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase", "username", "password");// 开始事务conn.setAutoCommit(false);// 插入第一行数据String insertQuery = "INSERT INTO customers (name, address) VALUES (?, ?)";pstmt = conn.prepareStatement(insertQuery);pstmt.setString(1, "John");pstmt.setString(2, "Highway 21");pstmt.executeUpdate();// 插入第二行数据pstmt.setString(1, "Peter");pstmt.setString(2, "Lowstreet 4");pstmt.executeUpdate();// 提交事务conn.commit();System.out.println("Transaction committed successfully!");} catch (SQLException e) {// 回滚事务try {if (conn != null) conn.rollback();} catch (SQLException excep) {excep.printStackTrace();}e.printStackTrace();} finally {// 关闭资源try {if (pstmt != null) pstmt.close();if (conn != null) conn.close();} catch (SQLException ex) {ex.printStackTrace();}}}
}

在上面的代码中,我们使用 setAutoCommit(false) 开始一个新的事务,并将两个插入操作封装在其中。如果事务执行成功,则使用 commit() 提交事务;否则,则使用 rollback() 回滚事务。

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

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

相关文章

springboot学习2

一、spring boot自动装配原理 pom.xml spring-boot-dependencies 核心依赖在父工程中 在写或者引入一些spring boot依赖的时候&#xff0c;不需要指定版本&#xff0c;因为有这些版本仓库启动器 <dependency><groupId>org.springframework.boot</groupId>&…

数据结构刷题笔记 | 数组、字符串、链表、栈、队列、数、图

本篇为笔者学习数据结构时&#xff0c;在牛客网站的刷题笔记。 数组——长度固定 数组是一种对象&#xff0c;不属于原生类&#xff0c;数组的大小确定之后不可改变。【原生类指未被实例化的类&#xff0c;数组一般指实例化&#xff0c;被分配空间的类】数组常用的两种基本操作…

C#,码海拾贝(18)——矩阵的(一般)三角分解法(Triangular Decomposition)之C#源代码,《C#数值计算算法编程》源代码升级改进版

1 三角分解法 Triangular Decomposition 三角分解法亦称因子分解法&#xff0c;由消元法演变而来的解线性方程组的一类方法。设方程组的矩阵形式为Axb&#xff0c;三角分解法就是将系数矩阵A分解为一个下三角矩阵L和一个上三角矩阵U之积&#xff1a;ALU&#xff0c;然后依次解…

数字化体验时代,企业如何做好内部知识数字化管理

随着数字化时代的到来&#xff0c;企业内部的知识管理也面临着新的挑战和机遇。数字化技术的应用&#xff0c;可以极大地提高企业内部知识的数字化管理效率和质量&#xff0c;从而提升企业内部的工作效率、员工满意度和企业竞争力。本文将从数字化时代的背景出发&#xff0c;探…

大数据 | HBase基本工作原理

前文回顾&#xff1a;MapReduce基本原理 目录 &#x1f4da;HBase基本介绍 &#x1f407;HBase的设计目标和功能特点 &#x1f407;HBase在Hadoop中的生态环境 &#x1f4da;HBase的数据模型 &#x1f407;逻辑数据模型 &#x1f407;物理存储格式 &#x1f4da;HBase基…

使用golang连接kafka

1 下载&#xff0c;配置&#xff0c;启动 kafka 下载链接 配置修改 在config目录下的server文件和zookeeper文件&#xff0c;其中分别修改kafka的日志保存路径和zookeeper的数据保存路径。 启动kafka 先启动kafka自带的zookeeper&#xff0c;在kafka的根目录下打开终端&a…

教程 | 多通道fNIRS数据的预处理和平均(下)

前言 前文近红外数据的预处理和平均&#xff08;上&#xff09;提到fNIRS是一种评估氧和脱氧血红蛋白浓度变化的方法&#xff0c;可与fMRI相媲美。fNIRS的不足是它的空间分辨率比fMRI差&#xff0c;但其优点是有更高的时间分辨率&#xff0c;并允许测量无法通过fMRI扫描仪测试…

VsCode 将源代码管理中的新旧代码上下对比变为左右对比

文章目录一、默认设置二、左右布局变成了上下布局三、解决方法&#xff1a;将上下布局改为左右布局1&#xff1a;找到右上角的更多设置2&#xff1a;点击更多设置后点击【切换到并排视图】3&#xff1a;效果如下&#xff08;还是原来的效果&#xff09;四、左右切换成上下总结一…

Python与各种开发语言比较、对比优略

选择要学习的技术和选择要上的大学一样重要&#xff0c;如果选错了&#xff0c;你将来不仅得不到自己喜欢的高薪工作&#xff0c;反而会弄得一堆麻烦。如果你打开了这篇文章&#xff0c;说明你已经考虑选择Python开发作为你以后的职业了。在这篇文章里&#xff0c;我们会详细找…

stata变量引用

stata变量引用–潘登同学的stata笔记 文章目录stata变量引用--潘登同学的stata笔记变量生成gen命令通配符&#xff1a;*, ?, -因子变量时间序列变量命名、前缀与标签变量命名、添加前缀通配符与批量重命名变量标签数字-文字对应表CSMAR数据处理查看、查找变量单值、暂元单值暂…

超详细!腾讯NLP算法岗面经(已offer)

作者 | ZipZou整理 | NewBeeNLP面试锦囊之面经分享系列&#xff0c;持续更新中 可以后台回复"面试"加入交流讨论组噢分享一篇旧文&#xff0c;希望大家都成功上岸~写在前面首先来段简单的自我介绍&#xff1a;2021届硕士&#xff0c;硕士期间未有实习经历&#xff0c…

FE_CSS 页面布局之浮动

网页布局的本质——用 CSS 来摆放盒子。 把盒子摆放到相应位置。CSS 提供了三种传统布局方式(简单说,就是盒子如何进行排列顺序)&#xff1a; 普通流&#xff08;标准流&#xff09;浮动定位 1 标准流&#xff08;普通流/文档流&#xff09; 所谓的标准流: 就是标签按照规定…

Runtime命令参数字符串和数组比较

问题 最近有个问题本地执行 ssh -p 8084 root10.224.122.51 \"ssh -p 22 root192.168.5.157 mkdir -p /opt/dw-release/pdld-admin\"程序执行总是报错&#xff1a; No such file or directory 但是直接在终端执行正常&#xff0c;这就很奇怪。肯定能推出是程序执行…

10.1 二重积分的概念与性质

学习目标&#xff1a; 学习二重积分&#xff0c;我会采取以下几个步骤&#xff1a; 了解基本概念&#xff1a;首先我会学习二重积分的定义及其意义&#xff0c;了解二重积分的性质和特点&#xff0c;以及二重积分的计算方法。 理解二重积分的几何意义&#xff1a;我会通过画图…

【无人机】基于灰狼优化算法的无人机路径规划问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

LeetCode——二叉树的非递归遍历

144. 二叉树的前序遍历 给你二叉树的根节点root&#xff0c;返回它节点值的前序遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1…

PDF怎么转CAD文件?(免费!高效转换方法汇总)

一般而言&#xff0c;PDF图纸是不能修改的。若需修改&#xff0c;则需将PDF转CAD&#xff0c;此时如何满足PDF转CAD的需求呢&#xff1f;今天&#xff0c;我将教你两种免费的PDF转CAD的方法&#xff0c;助力高效办公。 1.本地软件转换法 这是用本地软件转换方法&#xff0c;支…

JVM之GC日志解读

通过阅读Gc日志&#xff0c;我们可以了解Java虚拟机内存分配与回收策略。 内存分配与垃圾回收的参数列表 -XX:PrintGC 输出GC日志。类似&#xff1a;-verbose:gc-XX:PrintGCDetails 输出GC的详细日志-XX:PrintGCTimestamps 输出GC的时间戳&#xff08;以基准时间的形式&#xf…

软件企业利用ChatGPT的正确姿势

先来看一下现在市场环境 ChatGPT作为现象级产品横空出世之后&#xff0c;极大地带动了大语言模型产业和生成式AI&#xff08;AIGC&#xff09;产业的蓬勃发展。海外市场上&#xff0c;OpenAI、微软、谷歌、Meta等巨头动作频频。中国市场更是风起云涌&#xff0c;百度、阿里、华…

Golang每日一练(leetDay0034) 二叉树专题(3)

目录 100. 相同的树 Same Tree &#x1f31f; 101. 对称二叉树 Symmetric Tree &#x1f31f; 102. 二叉树的层序遍历 Binary Tree Level-order Traversal &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一…