数据库事务管理

news/2024/11/17 20:30:48/

在关系型数据库中,事务的实现通常采用“日志”(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.ppmy.cn/news/42814.html

相关文章

常用 Composition API--工程文件及setup

官方文档: https://v3.cn.vuejs.org/guide/composition-api-introduction.html 分析工程结构 vue3新添加的东西或修改的内容 首先import { createApp } from vue引入的不再是Vue的构造函数了,而是一个createAPP的工厂函数,什么是工厂函数? …

DW3000芯片驱动API介绍

目录 通用软件框架 典型的系统启动流程 IRQ中断处理流程 通用软件框架 下图显示了包含DW3xxx设备驱动程序API的软件系统的总体框架。设备驱动程序通过SPI接口控制IC。设备驱动程序通过通用函数writetospi()和readfromspi()调用目标SPI设备来抽象目标SPI设备。在将IC设备驱动…

python 理解BN、LN、IN、GN归一化、分析torch.nn.LayerNorm()和torch.var()工作原理

目录 前言: 简言之BN、LN、IN、GN等归一化的区别: 批量归一化(Batch Normalization,BN) 优点 缺点 计算过程 层归一化(Layer Normalization,LN) 优点 计算过程 总结 分析torch.nn.LayerNorm()工作原理 分析torch.var(…

光电隔离转换器 直流信号放大器 导轨安装DIN11 IPO OC系列

概述: 导轨安装DIN11 IPO OC系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要直流信号隔离测控的行业。此系列产品内部采用了线性光电隔离技术相…

Windows环境下实现设计模式——职责链模式(JAVA版)

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows环境下如何编程实现职责链模式(设计模式)。 不知道大家有没有这样的感觉,看了一大堆编程和设计模式的书,却还是很难理解设计模式&#xff…

Stable Diffusion Prompt相关整理

Stable Diffusion可以根据你输入的提示词(prompt)来绘制出想象中的画面。 1、正向提示词(Prompt): 提高图像质量的prompt: prompt 用途 HDR, UHD, 64K (HDR、UHD、4K、8K和64K)这样的质量词可以带来巨大的差异…

docker构建rocketMq集群

1 拉取nameSrv镜像 docker pull rocketmqinc/rocketmq 2 创建namesrv数据存储路径 mkdir -p /docker/rocketmq/data/namesrv/logs /docker/rocketmq/data/namesrv/store 注:mkdir -p 可以创建多级目录 3 构建namesrv容器 docker run -d \ --name rmqnamesrv …

pyside2 使用uic 工具转换Qt .ui文件到 .py文件

官方教程中(上面的官方文档中)提到了一个工具pyside2-uic,如果你电脑有pyside2-uic这个工具,那么使用下面命令进行转换。 pyside2-uic mainwindow.ui > ui_mainwindow.py你可以通过运行以下命令来使用 pip 安装 pyside2 库 pip install pyside2 安装完成后,pyside2-u…