【SQL】数据库事务

news2024/11/25 1:04:14

【SQL】数据库事务

  • 事物的ACID特性
  • 事务的状态
  • 显式事务
  • 隐式事务
  • 事务的使用举例
  • SQL中的四种隔离级别
  • MySQL中的隔离级别
    • 如何设置事务的隔离级别

innodb默认支持事务
事务是一组逻辑操作单元,使数据从一种状态转变到另一种状态

事物的ACID特性

  • 原子性(atomicity) 事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚
  • 一致性(consistency) 事务执行前后,数据从一个合法性状态变换到另外一个合法性状态。这种状态是语义上的而不是语法上的,跟具体的业务有关。
    举例:
    A账户有余额200元,转账出去300元,剩下余额-100元。此时数据不一致,因为余额要>=0。
    A账户200元,转账给B50元,A的账户钱扣了,但种种原因B的账户余额没有增加,此时数据不一致,因为A+B的总余额要不能变。
    在数据表中将姓名字段设为唯一约束,当事务提交或回滚时,数据表中的姓名不唯一,则破坏了事物的一致性要求。
  • 隔离性(isolation) 一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(durability) 一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

事务的状态

活动的,部分提交的,失败的,终止的,提交的
在这里插入图片描述

显式事务

# 事务的完成过程
# 步骤一:开启事务
# 步骤二:一系列的dml操作
# ...
# 步骤三:书屋的结束状态:提交的状态(commit),中止的状态(rollback)

# 显式事务
# 开启:
# start transaction (后可跟: read only / read write / with consistent snapshot ) 或 begin
# 保存点 savepoint

隐式事务

# 隐式事务
# 关键字: autocommit
# set autocommit = false;

SHOW VARIABLES LIKE 'autocommit';
# 此时一条dml操作是一个独立的事务,自动完成commit
UPDATE account SET balance = balance - 10 WHERE id = 1;
UPDATE account SET balance = balance + 10 WHERE id = 2;

# 关闭自动提交:
# 方式一:
SET autocommit = FALSE;	# 关闭自动提交以后,此时再写dml语句:
UPDATE account SET balance = balance - 10 WHERE id = 1;
UPDATE account SET balance = balance + 10 WHERE id = 2;
COMMIT; # 或 rollback
# 这两条语句算作一个事务操作进行提交或回滚

# 方式二:
# SET autocommit = true;	
# 在autocommit为true的情况下,使用start transaction或begin开启事务,那么dml操作就不会自动提交数据
START TRANSACTION;
UPDATE account SET balance = balance - 10 WHERE id = 1;
UPDATE account SET balance = balance + 10 WHERE id = 2;
COMMIT; # 或 rollback

事务的使用举例

SHOW VARIABLES LIKE 'autocommit';
USE atguigudb2;
# 例一:commit和rollback
# 1.
CREATE TABLE user3(NAME VARCHAR(15) PRIMARY KEY);
SELECT * FROM user3;

BEGIN;
INSERT INTO user3 VALUES('里斯'); # 此时不会自动提交
COMMIT;

BEGIN;	# 开启一个新的事物
INSERT INTO user3 VALUES('杰克');	# 此时不会自动提交
INSERT INTO user3 VALUES('杰克');	# 受主键影响,不能添加成功
ROLLBACK;	# 回滚到上一次commit

# 2.
TRUNCATE TABLE user3;	# ddl操作会自动提交数据,不受autocommit变量的影响

BEGIN;	# 开启一个新的事物
INSERT INTO user3 VALUES('杰克');	# 此时不会自动提交
COMMIT;
SELECT * FROM user3;

INSERT INTO user3 VALUES('tom');	# 默认情况下即autocommit为true,dml操作也会自动提交数据
INSERT INTO user3 VALUES('tom');	# 此时是事务失败的状态,接下来rollback回滚,把这个失败的状态终止

ROLLBACK;

# 3.
TRUNCATE TABLE user3;
SELECT * FROM user3;

SELECT @@completion_type;
SET @@completion_type = 1;	# 开启链式事务

BEGIN;
INSERT INTO user3 VALUES('张三');
COMMIT;

INSERT INTO user3 VALUES('李四');
INSERT INTO user3 VALUES('李四');

ROLLBACK;

SELECT * FROM user3;


# 例二:
# 体会innodb和myisam
CREATE TABLE test1(i INT) ENGINE = INNODB;
CREATE TABLE test2(i INT) ENGINE = MYISAM;

# 针对innodb
BEGIN
INSERT INTO test1 VALUES (1);
ROLLBACK;

SELECT * FROM test1;

# 针对myisam
BEGIN
INSERT INTO test2 VALUES (1);
ROLLBACK;	# 无效

SELECT * FROM test2;

# 例三:
CREATE TABLE user4(NAME VARCHAR(15),balance DECIMAL(10,2));

BEGIN 
INSERT INTO user4(NAME,balance) VALUES('张三',1000);
COMMIT;

SELECT * FROM user4;

BEGIN;
UPDATE user4 SET balance = balance - 100 WHERE NAME = '张三'; 
UPDATE user4 SET balance = balance - 100 WHERE NAME = '张三'; 

SAVEPOINT s1;	# 设置保存点
UPDATE user4 SET balance = balance + 1 WHERE NAME = '张三'; 

ROLLBACK TO s1;	# 回滚到s1
SELECT * FROM user4;

ROLLBACK;		# 回滚到最初状态
SELECT * FROM user4;	# balance = 1000

SQL中的四种隔离级别

SQL标准中设立了4个隔离级别:

  • READ UNCOMMITTED :读未提交,在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。不能避免脏读、不可重复读、幻读。
  • READ COMMITTED :读已提交,它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。可以避免脏读,但不可重复读、幻读问题仍然存在。
  • REPEATABLE READ :可重复读,事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容。可以避免脏读、不可重复读,但幻读问题仍然存在。这是MySQL的默认隔离级别。
  • SERIALIZABLE :可串行化,确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都可以避免,但性能十分低下。能避免脏读、不可重复读和幻读。

在这里插入图片描述

MySQL中的隔离级别

查看mysql隔离级别:SHOW VARIABLES LIKE 'transaction_isolation';

如何设置事务的隔离级别

global:全局设置,在下一次会话时生效,因mysql是内存级别,重启服务器后需要重新设置
SET GLOBAL transaction_isolation = 'read-committed';
session:仅对当前会话有效
SET SESSION transcation_isolation = 'read-uncommitted';

SET [GLOBAL|SESSION] TRANSACTION_ISOLATION = '隔离级别'
#其中,隔离级别格式:
> READ-UNCOMMITTED
> READ-COMMITTED
> REPEATABLE-READ
> SERIALIZABLE

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

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

相关文章

Java搭建宝塔部署实战毕设项目springboot车险理赔管理系统源码

大家好啊,我是测评君,欢迎来到web测评。 本期给大家带来一套Java开发的毕业设计项目springboot车险理赔管理系统源码。 技术架构 技术框架:SpringBoot mybatis bootstrap jquery mysql5.7运行环境:jdk8 nginx1.20 tomcat9 …

QT学习笔记(六)——QT弹出对话框并在主窗口调用对话框的信息

QT弹出对话框并在主窗口调用对话框的信息,显示影像 最近封控,大部分时间都在自己学习写代码,有点feel 了哈,自己摸出来一个简单的qt 界面,也实现了自己想要的功能。本篇博客主要记录一下,如何弹出对话框&a…

[附源码]SSM计算机毕业设计疫情期间物资分派管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

@Accessors 注解作用

文章目录前言一、Accessors 源码二、Accessors 属性说明1、fluent 属性2、chain 属性3、prefix 属性前言 在最近的工作中,看到 Accessors(chain true) 这样的注解,上网查询了下,他是 lombok 插件包中的一个注解,那么它是什么意思…

如何快速实现一个颜色选择器

在做前端界面开发的时候,遇到需要改变颜色的需求,就需要使用颜色选择器。 针对这个问题,第一想法,自然是H5提供了input color,可以实现。但不出意外的,IE并不支持。而且,chrome的实现方式和fire…

[附源码]Python计算机毕业设计Django个人博客系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

【java】输入输出流

文章目录标准输入流标准输出流字节打印流字符打印流案例--复制java文件(文件打印流版本)对象序列化流序列化流反序列化流serialVersionID&transientProperties作为Map集合的使用Properties作为集合的特有方法Properties与IO流相结合的方法案例--游戏…

必备模块知识——超声波传感器

一、超声波传感器 1、什么是超声波 人们能听到声音是由于物体振动产生的,它的频率在20HZ-20KHZ范围内,超过20KHZ称为超声波,低于20HZ的称为次声波。常用的超声波频率为几十KHZ-几十MHZ。 2、什么是超声波传感器(常用的HC-SR04超…

基于PHP+MySQL教室预约管理系统的设计与实现

随着我国国民教育的提高,大学生的数量一直在不断的增加,根据网络资料的查询,发现2012年的大学生人数为600万,这是一个不小的数量,说明了我国教育的进步是巨大的。但是问题也随之产生,每年如此多的大学生就需要大学不断的扩建,可是还是不能满足如此多的学生对教室的使用,所以如何…

【学习笔记】深度学习入门:基于Python的理论与实现-与学习相关的技巧

CONTENTS六、与学习相关的技巧6.1 参数的更新6.2 权重的初始值6.3 Batch Normalization6.4 正则化6.5 超参数的验证六、与学习相关的技巧 6.1 参数的更新 神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为…

YOLOv7(目标检测)数据集、训练、推理过程

一、环境安装: pip install -r requirements.txt pip install torch1.8.2cu111 torchvision0.9.2cu111 torchaudio0.8.2 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html -i https://pypi.tuna.tsinghua.edu.cn/simple二、修改配置环境 直接看下面…

[附源码]SSM计算机毕业设计血库管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

JavaScript -- 03. 运算符介绍

文章目录运算符1 算数运算符1.1 基础符号1.2 自动类型转换2 赋值运算符3 一元4 自增和自减4.1 自增运算符4.2 -- 自减运算符5 逻辑运算符5.1 逻辑非5.2 逻辑与5.3 逻辑或6 关系运算符7 相等运算符7.1 7.2 7.3 !7.4 !8 条件运算符(三元表达式)9 运算符的…

专栏 | 解析“全闪对象存储”(三)

在上一节“对象存储的使用场景”中,我们介绍了对象存储在大规模非结构化数据存储、云存储、大数据和数据湖等场景的使用。 那么,优秀对象存储产品是怎样的?如何设计、实现?本节,我们来分析、探讨这些问题。 通过前两…

推荐系统-召回-概述(四):热门推荐

无论个性化多么重要,热门推荐都是推荐系统里不可或缺的一部分。其一、根据“二八定律”,电商系统中的20%的头部内容被80%的流量消费,因此,在产品早期,仅仅推荐热门内容,实施成本不高,且效果也会…

【Android App】利用腾讯地图获取地点信息和规划导航线路讲解及实战(附源码和演示视频 超详细必看)

需要源码请点赞关注收藏后评论区留言~~~ 一、获取地点信息 至于如何集成腾讯地图和调用腾讯地图接口此处不再赘述,有需要请参见我之前的博客 腾讯地图用来搜索POI地点的工具是TencentSearch,通过它查询POI主要分为下列四个步骤: &#xff0…

MySQL---基于CentOS7

在Linux上安装MySQL 本章简单阐述一下,mysq基于centos7的安装步骤 在VM上模拟安装 MySQL版本为:8.0.30 文章目录在Linux上安装MySQL1. MySQL下载卸载MariaDB查看版本卸载2.安装解压mysql压缩包重命名创建用户和组修改权限编写配置文件配置PATH变量初始化…

基于PHP+MySQL集训队员管理系统的设计与实现

ACM是国际大学生程序设计竞赛,这是一个展示大学生风采的平台,但是在ACM报名的时候可能会有很多的队员,管理员对队员的管理是一个繁琐且复杂的过程,通常的管理模式是手工进行管理,这在很大程度上有一些弊端,为了改成这一现状需要一个对应的管理系统出现。 本设计尝试用PHP开发一…

机组运行约束对机组节点边际电价的影响研究(Matlab代码实现)

目录 1 概述 2 日前市场单时段节点电价出清优化模型 2.1 目标函数 2.2 约束条件 3 算例及运行结果 4 结论 5 参考文献 6 Matlab代码及详细文章讲解 1 概述 基于节点边际电价(locational marginal priLMP)的现货巾划lm易能量价值,节点电本确定节点电价&a…

高校部署房产管理系统可实现那些目标?

随着技术的不断进步和升级,以及高校房屋建筑物数量的不断扩充,建立房屋资产管理信息系统进行信息化、数字化、图形化房屋资产管理已经是势在必行。数图互通自主研发FMCenterV5.0平台,是针对中国高校房产的管理特点和管理要求,研发…