数据库的事务管理

2024-08-25 13:04
文章标签 数据库 事务管理

本文主要是介绍数据库的事务管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

基本概念

含义

事务管理使用原因

事务常见操作

事务版本

事务提交方式

 常见操作实践

事务错误处理机制分析

事务四大特性

事务隔离级别

基本概念

含义

事务管理:数据库中确保数据一致性以及完整性的一种机制。事务是一个包含多个操作的逻辑单元,这些操作要么全部执行成功,要么全部回滚,不会影响数据库的状态

  • 理解:假如参加某平台会员后,当退出会员机制的时候,通过你的ID,会将你的所有信息从会员存储系统中清除,这一整个删除数据的过程,就可以称为一个事务
  • 数据库中同一时刻会有很多的事务在同时进行

事务管理使用原因

  • 确保数据完整性:通过事务ACID特性,数据库能够在复杂操作中保持数据一致性和完整性
  • 支持并发操作:通过事务隔离级别,控制多个事务并发执行的时候相互影响,防止数据冲突
  • 可以简单理解为,防止多人去查看同一数据时,出现不一致的情况

事务常见操作

常见操作总结

  • BEGIN:开始一个事务。
  • COMMIT:提交事务,将所有操作永久保存到数据库。
  • ROLLBACK:回滚事务,撤销事务中的所有操作。

事务版本

登录进入数据库后,查看是否使用engines数据库引擎

事务提交方式

查看提交方式,正常有两种提交方式,手动提交和自动提交

  • 下文示例操作:开启和关闭自动提交

 常见操作实践

设置成读未提交

一个数据库创建表,另一个数据库查看表

事务的开始与回滚 

  • 启动事务:启动事务后的所有操作,都属于同一事务的操作

一个数据库插入数据后,另一个数据库可以立刻看到,同时设置保存点,回滚使用 

回滚事务,数据库变化 

 事务提交,提交后就无法再进行回滚了 

事务错误处理机制分析

重要结论总结

  • 当开启事务的时候,即begin或者start transaction,事务必须通过commit进行提交,提交后的数据才会持久化,与是否设置set autocommit无关
  • 事务可以实现手动回滚,当出现异常的时候,MySQL会自动回滚
  • 针对于InnoDb会将每一条SQL语句封装成事务,然后自动提交
  • 事务本身是具有原子性以和持久性的

commit之前,客户端崩溃,MySQL会自动回滚到之前信息

事务提交后,客户端崩溃,MySQL中的数据不会受到影响,因为数据已经持久化了

begin会自动更改提交方式,不会受到MySQL是否自动提交的影响 

开启默认提交后,数据库终端异常崩溃后,数据仍然可以持久化存储在数据库中 

事务四大特性

  • 原子性
    • 含义:事务中的所有操作要么全部成功,要么全部失败并回滚,事务是不可分割的
    • 作用:确保部分操作失败的时候,数据库不会留下不完整的数据
  • 一致性
    • 含义:事务执行前后,数据库必须保持一致性,符合预设的规则和约束
    • 作用:确保事务完成后,数据库从一个合法状态转换为另一个合法状态
  • 隔离性
    • 含义:多事务并发的时候,一个事务的操作对于其他事务操作失隐藏的,直到该事务提交
    • 作用:避免并发事务之间的干扰,防止数据不一致
  • 持久性
    • 含义:一旦事务提交,结果将永远保存在数据库中,即使系统崩溃也不会丢失
    • 作用:确保事务完成后数据持久保存
//测试代码
CREATE DATABASE bank;
USE bank;CREATE TABLE accounts (account_id INT PRIMARY KEY,account_name VARCHAR(50),balance DECIMAL(10, 2)
);INSERT INTO accounts (account_id, account_name, balance) VALUES
(1, 'Account1', 1000.00),
(2, 'Account2', 500.00);

原子性:模拟转账行为,执行commit之前程序崩溃,验证事务会自动回滚

 

一致性:验证转账后,所有账户的总额不变 

 隔离性:多个事务同时执行,避免数据冲突,具体要根据隔离性

 

持久性:事务一旦提交,数据就会永久的存储在数据库中,即使系统崩溃也不会造成数据丢失

事务隔离级别

数据库为保证事务执行过程中减少其他事件的干扰,所以需要对干扰进行隔离,其又针对干扰的不同程度,设计出干扰级别。

  • 未提交读:事务可以读取其他未提交事务的数据,可能导致脏读
  • 提交读:事务只能读取已提交的数据,避免脏读,但可能出现不可重复读,该级别也是多数数据库默认的方式
  • 可重复读:保证事务在执行期间看到的数据一致,防止不可重复读,但是可能会出现幻读
  • 可串行化:最高级别隔离,确保事务按顺序执行,避免所有并发问题,但是性能最差,有可能会导致超时和锁竞争问题,所以很少会去使用
CREATE DATABASE isolation_test;
USE isolation_test;CREATE TABLE products (product_id INT PRIMARY KEY,product_name VARCHAR(50),quantity INT
);INSERT INTO products (product_id, product_name, quantity) VALUES
(1, 'ProductA', 100),
(2, 'ProductB', 50);

未提交读:其他终端可以读取还未提交的更新的数据,终端2看到的内容总是根据终端1实时更新

提交读:只可以读取已经提交的数据

可重复读:确保在终端1的同一事务中,多次读取的事务一致 

 

可串行化:终端1事务提交之前,终端2的操作将被阻塞,确保事务按顺序执行

 

这篇关于数据库的事务管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105624

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

DM8数据库安装后配置

1 前言 在上篇文章中,我们已经成功将库装好。在安装完成后,为了能够更好地满足应用需求和保障系统的安全稳定运行,通常需要进行一些基本的配置。下面是一些常见的配置项: 数据库服务注册:默认包含14个功能模块,将这些模块注册成服务后,可以更好的启动和管理这些功能;基本的实例参数配置:契合应用场景和发挥系统的最大性能;备份:有备无患;… 2 注册实例服务 注册了实例服务后,可以使用系统服务管理,

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

MyBatis 切换不同的类型数据库方案

下属案例例当前结合SpringBoot 配置进行讲解。 背景: 实现一个工程里面在部署阶段支持切换不同类型数据库支持。 方案一 数据源配置 关键代码(是什么数据库,该怎么配就怎么配) spring:datasource:name: test# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# @需要修改 数据库连接及驱动u

CentOS下mysql数据库data目录迁移

https://my.oschina.net/u/873762/blog/180388        公司新上线一个资讯网站,独立主机,raid5,lamp架构。由于资讯网是面向小行业,初步估计一两年内访问量压力不大,故,在做服务器系统搭建的时候,只是简单分出一个独立的data区作为数据库和网站程序的专区,其他按照linux的默认分区。apache,mysql,php均使用yum安装(也尝试

Java基础回顾系列-第九天-数据库编程

Java基础回顾系列-第九天-数据库编程 数据库简介工具包java.sql API 内容与数据库建立连接执行SQL语句数据库检索和更新查询结果SQL类型对应Java类型映射元数据异常 API方法DriverManagerConnectionStatementPreparedStatementCallableStatementResultSetjava.sql.Date批处理、存储过程、事务