【SQL】数据库事务

news/2024/5/18 21:45:31/文章来源:https://blog.csdn.net/weixin_44016186/article/details/128095800

【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.luyixian.cn/news_show_228450.aspx

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

相关文章

[附源码]Python计算机毕业设计SSM辽宁科技大学二手车交易平台(程序+LW)

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

【OpenCV-Python】教程:3-10 直方图(2)直方图均衡

OpenCV Python 直方图均衡化 【目标】 理解直方图均衡化提升图像的对比度 Histogram Equalization ??? 将图像的直方图拉均衡一些,分散一些;可以提升对比度。 【代码】 通过上面的图像可以看出,高亮度区域较少,需要分散该图像…

新零售行业如何玩转线上服务

如今,随着市场的千变万化,企业的商业模式正在不断经历革新。如线上企业不再单纯走电商路线,纷纷进军线下卖场,而传统门店也在寻找线上突围的机会,通过与电商平台合作,开启线上专卖店。线上线下相结合的新零…

Java并发编程—Thread类中的start()方法如何启动一个线程?

一、java线程的介绍: 在java的开发过程中,很多铁子对于java线程肯定不感到陌生,作为java里面重要的组成部分,这里就从如何创建一个线程给大家进行分析; 二、相关知识引入: ​ 之前我了解过,j…

题目1444:蓝桥杯201 4年第五届真题斐波那契

这篇文章是帮一个叫做【废柴成长中】的孩子写的。 题目&#xff1a; 这里难点应该就是在【输入为一行用空格分开的整数n m p(0<n,m&#xff0c;p<10^18)】 &#xff0c;这里一下子就把最大值干成long的最大范围了&#xff0c;很明显&#xff0c;long肯定也不行。 解析其…

简单封装一个易拓展的Dialog

Dialog&#xff0c;每个项目中多多少少都会用到&#xff0c;肯定也会有自己的一套封装逻辑&#xff0c;无论如何封装&#xff0c;都是奔着简单复用的思想&#xff0c;有的是深层次的封装&#xff0c;也就是把相关的UI效果直接封装好&#xff0c;暴露可以修改的属性和方法&#…

带你学习不一样的数据仓库系列-框架概念

编者按&#xff1a;本系列文章参考总结自IBM,FaceBook&#xff0c;Google等数据仓库构建英文文章&#xff0c;部分章节为直译过来&#xff0c;部分内容加上乐哥6年陌陌&#xff0c;快手等工作经验总结而来&#xff0c;让大家了解真实国外大厂数仓构建之路&#xff0c;国外同行对…

RabbitMQ初步到精通-第十一章-RabbitMQ之常见问题汇总

目录 RabbitMQ之常见问题汇总 1.rabbitmq丢消息场景 1.1 消息未持久化丢失 1.2 消费时消息丢失 1.3 如何阻止消息丢失 2. mq消费消息是pull 还是 push 2.1 pull形式消费 2.2 push形式消费 3. mq重复消费场景 3.1 生产端重复情况 3.2 消费端重复 3.3 如何防止 4.pre…

今年十八,喜欢ctf-web

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红中 &#x1fad2;每日emo&#xff1a;等我把脸皮磨厚 &#x1f342;专栏地址&#xff1a;网安专栏 本来想早点睡&…

抓包工具简单介绍和 fiddler 安装

目录 1、 抓包工具介绍 2、原理 3、fiddler 安装 1、 抓包工具介绍 抓包工具&#xff0c;是个特殊的软件&#xff0c;相当于一个 “代理程序”&#xff0c;浏览器给服务器发的请求就会经过这个代理程序&#xff0c;进一步的就能分析出请求和响应的结果如何。 通俗的讲&…

【附源码】计算机毕业设计JAVA重工教师职称管理系统

【附源码】计算机毕业设计JAVA重工教师职称管理系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA…

【Pandas数据处理100例】(九十四):Pandas使用any()判断DataFrame中是否有True

前言 大家好,我是阿光。 本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPandas版本:1.3.5N…

Kotlin高仿微信-第26篇-朋友圈-选择图片、小视频对话框

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

基于ARM的环境参数检测系统设计(Labview+STM32+ZigBee)

目 录 1 绪论 1 1.1 研究背景和意义 1 1.2 研究现状 2 1.3 研究内容 3 2 系统概述和相关原理 4 2.1 系统的功能分析与设计 4 2.2 LabVIEW介绍 5 2.3 ZigBee技术 5 2.3.1 ZigBee技术概述 5 2.3.2 ZigBee网络协议 6 2.3.3 ZigBee网络拓扑结构 7 2.4 GSM技术 8 2.5 本章小结 8 3 …

[附源码]计算机毕业设计springboot企业售后服务管理系统

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

聚焦出海 长城汽车50多国家和地区经销商集团齐聚泰国车博会

11月30日&#xff0c;长城汽车携新能源豪华阵容登陆第39届泰国国际汽车博览会&#xff08;简称“泰国车博会”&#xff09;。以“GWM Light the Future”&#xff08;长城汽车点亮未来&#xff09;为参展主题&#xff0c;长城汽车旗下中大型商务豪华SUV坦克500 HEV量产版、欧拉…

pytest + yaml 框架 - 3.全局仅登录一次,在用例中自动在请求头部添加Authentication token认证

前言 我们在使用自动化测试框架的时候&#xff0c;经常会遇到一个需求&#xff0c;希望在全局用例中&#xff0c;仅登录一次&#xff0c;后续所有的用例自动带上请求头部token 或者cookies。 环境准备 Python 3.8版本 Pytest 7.2.0 最新版 pip 安装插件 pip install pytes…

iOS开发之打包上传到App Store——(一)各种证书的理解

OK&#xff0c;有日子没写iOS开发的相关文章啦&#xff0c;主要是最近的精力都没在这上面&#xff0c;不过既然产品已经快要出来了&#xff0c;就有必要了解一下各种证书啥的&#xff08;众所周知iOS的一堆证书可是很让人头大呀&#xff09;&#xff0c;最近确实被这个搞得头大…

Microsoft SQL Server 图书管理数据库的建立

文章目录题目描述创建数据库使用数据库创建三个表外码的表示形式结果展示题目描述 – 新建 “图书管理数据库" – 其中包含三个关系 – 图书&#xff08;编号&#xff0c;图书名&#xff0c;作者&#xff0c;出版社&#xff0c;类型&#xff0c;单价&#xff09; – 借阅…

Golang学习——基于vscode安装go环境

环境介绍 Linux x86_64 vscode 1.63.2 部署流程 下载并部署go安装包 根据实际环境&#xff0c;直接在go官网下载相应的编译好的二进制安装包即可&#xff1a; wget https://golang.google.cn/dl/go1.19.3.linux-amd64.tar.gz下载完成后解压安装包&#xff0c;然后将压缩包…