mysql-210714-01

Oracle实例管理 ORACLE 阅读详情

mysql-210714-02

  • 事务(Transaction)

事务(Transaction)

什么是事务

TCL  事务控制语言

commit		提交事务
rollback 	回滚事务
savepoint	保存点

start transaction 	关闭自动提交机制 
一个事务是一个完整的业务逻辑单元,不可再分。


比如:银行账户转账,从A账户向B账户转账1000,需要 执行两条update语句
	update t_act set balance=balance-1000 where actno='act-101';
	update t_act set balance=balance+1000 where actno='act-102';

	以上两个DML语句必须同时成功,同时失败,
	不允许一个成功,一个失败。
	想要保证以上两条DML语句同时成功或同时失败,那么就需要使用数据库的 “事务机制” 。
和事务相关的语句只有DML语句(insert,delete,update)
	因为这三个语句都是和数据库表中的 “数据” 相关的。
	事务的存在是为了保证数据的完整性,安全性。
理解:
	事务就是 “捆绑” 一系列DML语句,
	要么同时执行成功,要么就失败。

事务原理

假设有一件事,
需要先执行insert语句,再执行update语句,最后执行delete语句,
然后结束。
开启事务机制(开始)

执行insert语句--->insert...
(这个执行完成后,把这个执行记录到数据库的操作历史当中,并不会向文件中保存一条数据,不会真正的修改硬盘上的数据。)
执行update语句--->update...
(这个执行完成后,也是记录历史操作,不会真正的修改硬盘上的数据。)
执行delete语句--->delete...
(这个执行完成后,也是记录历史操作[记录到缓存],不会真正的修改硬盘上的数据。)

提交事务或回滚事务(结束)
提交事务(commit)
会把 “开始---结束” 的一系列DML操作 中的数据持久化到硬盘上,
把 “开始---结束” 间的历史操作(历史缓存)清空。

回滚事务(rollback)
把 “开始---结束” 间的历史操作(历史缓存)清空。

事务特征

事务包括四大特征(ACID):
	A:原子性:事务最小的工作单元,不可再分。
	C:一致性:事务必须保证多条DML语句同时成功或同时失败。
	I:隔离性:事务A与事务B之间具有隔离。
	D:持久性:最终数据必须持久化到银盘文件中去,事务才算结束。
	
Atomicity,Consistency,Isolation,Durability

关于事务的隔离级别

事务隔离性存在隔离级别,理论上隔离级别包括4个
	
	第一级别:读未提交  (read uncommitted)
		对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。
		读未提交存在 脏读现象(Dirty Read) ,表示读到了脏的数据。
		
	第二级别:读已提交  (read committed)
		对方事务提交之后的数据我方可以读取到,
		这个隔离级别解决了:脏读现象,
		读已提交隔离级别存在的问题:不可重复读。
		
	第三级别:可重复读  (repeatable read)
		这个隔离级别解决了:不可重复读,
		可重复读隔离级别存在的问题:读取到的数据时是 “幻想”。
		
	第四级别:序列化读 / 串行化读
		解决了所有问题,
		效率低,需要事务排队。
		
		
Oracle数据库默认的隔离级别是:读已提交
MySQL数据库默认的隔离级别是:可重复读

// 设置业务隔离级别
mysql> set global transaction isolation level read uncommitted;
// 查看当前隔离级别
// MySQL 8 版本 使用这条语句,查看当前隔离级别。
mysql> select @@global.transaction_isolation;
关于级别的理解

第一级别:
	两个同学操作同一个数据库,同一个表,
	同学A操作DML语句,还未提交事务,
	但是同学B能获取同学A操作(DML)的数据。
	
第二级别:
	两个同学操作同一个数据库,同一个表,
	同学A,同学B都开启MySQL命令窗口,
	同学B一直在进行DML操作,
	同学A在此期间进行DQL操作,查询结果就一直不一样。
	
第三级别:
	两个同学操作同一个数据库,同一个表,
	同学A,同学B都开启MySQL命令窗口,
	同学B一直在进行DML操作,
	同学A在此期间进行DQL操作,查询的结构始终是一开始的结果,
	不会随着同学B的操作,而影响到同学A的DQL操作的结果。
	
第四级别:
	两个同学操作同一个数据库,同一个表,
	同学A,同学B都开启MySQL命令窗口,
	如果同学A在进行DML操作,
	这时候同学B也来进行DML操作,此时不允许同学B操作,
	需要排队等,同学A操作完在轮到同学B。

事务演示

MySQL事务默认情况下是自动提交的。
只要执行任意一条DML语句则提交一次。
关闭自动提交机制
	start transaction;
// 准备表
drop table if exists t_user;
create table t_user(
	id int primary key auto_increment,
	username varchar(255)
);

事务自动提交

// 插入信息
mysql> insert into t_user(id,username) values(1001,'bgy1001');

// 查询信息
mysql> select * from t_user;
+------+----------+
| id   | username |
+------+----------+
| 1001 | bgy1001  |
+------+----------+

// 事务回滚
mysql> rollback;

// 回滚完还是一样,说明MySQL默认自动提交事务。
mysql> select * from t_user;
+------+----------+
| id   | username |
+------+----------+
| 1001 | bgy1001  |
+------+----------+

关闭事务自动提交(未提交事务)

// 使用 start transaction 关闭自动提交机制 
mysql> start transaction;

// 查询信息
mysql> select * from t_user;
+------+----------+
| id   | username |
+------+----------+
| 1001 | bgy1001  |
+------+----------+

// 插入记录
mysql> insert into t_user(id,username) values (1002,'bgy1002');
// 修改记录
mysql> update t_user set username='bgy1001test' where id=1001;

// 再次查询信息,但是数据没有提交,数据已被修改
mysql> select * from t_user;
+------+-------------+
| id   | username    |
+------+-------------+
| 1001 | bgy1001test |
| 1002 | bgy1002     |
+------+-------------+

// 事务回滚
mysql> rollback;

// 再次查询信息,数据恢复成原来数据
mysql> select * from t_user;
+------+----------+
| id   | username |
+------+----------+
| 1001 | bgy1001  |
+------+----------+

手动事务提交(提交事务)

// 查询信息
mysql> select * from t_user;
+------+----------+
| id   | username |
+------+----------+
| 1001 | bgy1001  |
+------+----------+

// 使用 start transaction 关闭自动提交机制 
mysql> start transaction;

// 添加数据信息
mysql> insert into t_user(id,username) values(1002,'xiaowu');
mysql> insert into t_user(id,username) values(1003,'laoli');

// 查询信息,此时事务未提交
mysql> select * from t_user;
+------+----------+
| id   | username |
+------+----------+
| 1001 | bgy1001  |
| 1002 | xiaowu   |
| 1003 | laoli    |
+------+----------+

// 提交事务
mysql> commit;

// 查询信息
mysql> select * from t_user;
+------+----------+
| id   | username |
+------+----------+
| 1001 | bgy1001  |
| 1002 | xiaowu   |
| 1003 | laoli    |
+------+----------+

// 事务回滚
mysql> rollback;

// 查询信息,发现数据回滚不去了
// rollback,只能回滚到上一级的提交点
mysql> select * from t_user;
+------+----------+
| id   | username |
+------+----------+
| 1001 | bgy1001  |
| 1002 | xiaowu   |
| 1003 | laoli    |
+------+----------+

演示读未提交(read uncommitted)

读未提交(read uncommitted)

打开两个dos窗口,连上统一个数据库,同一个表
dos01窗口

// 使用数据库mysql_test_210711_01
mysql> use mysql_test_210711_01;

// 设置业务隔离级别
mysql> set global transaction isolation level read uncommitted;

// 查看当前隔离级别
// 报错原因,我的MySQL是8版本,
// select @@global.tx_isolation这个语句适合5版本
mysql> select @@global.tx_isolation;
ERROR 1193 (HY000): Unknown system variable 'tx_isolation'

// 查看当前隔离级别
// MySQL 8 版本 使用这条语句,查看当前隔离级别。
mysql> select @@global.transaction_isolation;
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| READ-UNCOMMITTED               |
+--------------------------------+

// 退出重新进
exit;

// 进入数据库,并查看当前的隔离级别
mysql> use mysql_test_210711_01;
mysql> select @@global.transaction_isolation;
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| READ-UNCOMMITTED               |
+--------------------------------+

// 关闭自动提交事务机制
mysql> start transaction;

// 查看 dos02窗口 还没进行DML操作语句之前的表数据
mysql> select * from t_user;
+------+----------+
| id   | username |
+------+----------+
| 1001 | bgy1001  |
| 1002 | xiaowu   |
| 1003 | laoli    |
| 1004 | mingming |
+------+----------+

// 查看 dos02窗口 进行DML操作语句之后的表数据
// 发现 dos02窗口 还没提交事务, 这里就能查询到表数据。
mysql> select * from t_user;
+------+----------+
| id   | username |
+------+----------+
| 1001 | bgy1001  |
| 1002 | xiaowu   |
| 1003 | laoli    |
| 1004 | mingming |
| 1005 | fugui    |
+------+----------+
dos02窗口
// 进入数据库
mysql> use mysql_test_210711_01;

// 关闭自动提交事务机制
mysql> start transaction;

// 没有提交事务
mysql> insert into t_user(username) values('fugui');
STM32G474+Simulink+HIL硬件在环仿真 硬件:STM32G474RET6(官方的NUCLEO板)软件:STM32Cube_FW_G4 V1.6.1芯片包;KeilMATLAB 2023B(本文已成功)STM32嵌入式支持包。 阅读详情

相关推荐

Flutter 直接调用so动态库,或调用C/C++源文件内函数

我把 .so 文件尝试放过好几个目录/lib/,最终都会报这个错误,现在才知道库文件需要放在你根本想象不到的地方!!!尝试了一些方法还是不行后我放弃了 ffi,想着用 Flutter 的 MethodChannel 桥接 android/ios 原生,再让原生去调 native 层。一顿操作把Android端的搞定了,当然中间涉及到 Kotlin和C++ 层的数据类型映射的痛苦,而且业务函数也不像一个 helloworld 那么简单,别提有多痛苦了。

开发以大橘为重 8351

Mysql 8手动终止某个事务并释放其持有的锁

是可以执行的,再去数据表看最新数据发现,刚这个事务没有提交的数据变更是没有生效的。这是由innodb的原子性保障了,要么事务提交成功,所有变更生效,要么事务未提交事务内所有变更都不生效。持有了行记录3的排它锁,且无间隙锁,锁类型是行锁,额外还获得了表锁的意向排他锁(意向跑排他锁不等于持有排它锁,只是表达一个意向,并没有持有这个表级排它锁)在mysql数据库里的information_schema.INNODB_TRX表中存储有innodb的所有事务,我们可以查看该表来查看正在进行的事务。

HumorChen的博客 2047

不用公网IP,如何在内网高效搭建RustDesk远程控制服务器?基于Windows Server 2019的完整实践

本文详细介绍了在Windows Server 2019上部署RustDesk远程控制服务器的完整实践方案,无需公网IP即可实现内网高效远程控制。从环境准备、基础服务安装到网络与安全配置,提供了零成本的私有化部署指南,适用于企业、校园等内网环境。

weixin_28737073的博客 455

如何终止长时间运行的 MySQL 事务

本文档旨在解决 MySQL 中事务一直处于 状态但未持有锁的问题,并提供有效终止该事务的方法,以及防止类似问题再次发生的优化建议。在 MySQL 中,当事务长时间运行且未持有锁时,可能会导致以下问题:为解决这一问题,我们需要找到对应事务并安全地终止它.

Randy的博客 1727

深入解析Vortex GPGPU cache设计(2),关于cache_bank

本文分析了Vortex处理器的cache_bank模块设计,作为cache系列的第二部分。文章详细阐述了cache_bank的基本结构,包括地址位分配和默认配置参数。重点解析了cache的5种操作及其优先级。文章详细介绍了二级流水线设计,包括TAG/DATARAM的读写操作时序。

weixin_55313207的博客 1168

微信公众号数据采集实战:历史文章、互动数据与评论详情全解析

本文提供了一套完整的微信公众号数据采集实战方案,详细解析了如何通过接口调用获取公众号的历史文章列表、单篇文章的互动数据以及详细的用户评论。文章从环境准备、核心参数解析到分页逻辑、批量处理和异常处理,提供了可运行的Python代码示例,旨在帮助开发者高效、稳定地构建自动化采集工具,用于竞品分析、内容研究和舆情监控。

u5v6w7的博客 1597

Mysql 关闭自动提交事务【基础篇-01】

Mysql 8.0 关闭自动提交事务【基础篇-01】 特此郑重声明!该文章是原创作品,小编编写实属不易 ,帮忙点赞关注一下~转载小伙伴请注明出处!谢谢 Mysql 简介 MySQL 是一个开源的 关系数据库管理系统(RDBMS)。它的名字是"My"(Mysql联合创始人Michael Widenius[迈克尔·维德纽斯]的女儿的名字) 和"SQL"(Structured Query Language)的组合。关系数据库将数据组织成一个或多个数据表,其中数据类型可能相互关联;这些关系有助于构建数据。 My

jjc120074203的博客 2074

别再死磕SPWM了!手把手教你用STM32实现SVPWM驱动PMSM电机(附代码)

本文详细介绍了如何使用STM32实现SVPWM驱动PMSM电机,对比传统SPWM方案,SVPWM在电压利用率、电流THD、转矩脉动和稳态温升等方面均有显著提升。通过克拉克变换优化、扇区快速判断和矢量作用时间补偿等核心算法,结合STM32硬件加速技巧,实现高效电机控制。附代码示例,助力开发者快速掌握SVPWM技术。

weixin_28733777的博客 274

MySQL之事务详解

一、用途 事务主要用于处理操作量大、复杂度高的数据 例如在人员管理系统中,要删除一个人员,你既要删除人员的基本资料,也要删除和该人员相关的信息,比如QQ号、微信号、邮箱、文章等,这些数据库操作语句就构成了一个事务 二、条件与级别 1.事务基本要素 原子性、一致性、隔离性、持久性 原子性 一个事务中的所有操作,要么全部完成,要么全部不完成 事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像事务从来没执行过一样 一致性 事务开始前和事务完成后,数据库完整性没有被破坏 写入的资料完全符合

zengxingyuluo的博客 993

【24E】SWT6652 wifi驱动加载失败问题分析及解决方案

修改驱动配置Kconfig。是由于内存分配失败导致。

wgl307293845的博客 219

数据库课程案例——电力公司收费管理系统分析与实践,完整带SQL语句

某电力公司收费管理信息系统实现客户信息、用电类型(类别号、类别名、电价)及业务员管理;实现客户用电信息管理(客户号、月份、用电类别号、用电度数);实现客户费用管理(客户号、月份、费用、收费标志),收费标志的默认值为“未收”;实现收费登记(客户、月份、应收费用、实收费用、业务员),并自动修改收费标志(用触发器实现);创建触发器,实现收费时自动更加应收费用和实收费用,计算本次结余,然后修改客户信息表中的结余金额;创建存储过程统计指定月份应收费用和实收费用;创建存储过程查询指定月份未交费的用户信息,以便崔费;创建

qq_44242804的博客 2762

Mysql日志binlog、redolog、undolog

这里的新版本并不是说一行记录会拷贝成多份,记录只存最新的一条,然后之前的版本会各自对应一条undo log,日志里会记录变更内容的原始值。这时会把修改先记录到log buffer,在提交事务时,先把redo log的状态设置为prepare并存入磁盘,然后提交binlog存入磁盘,最后将redo log设置为commit状态存日磁盘。另一个是用于数据库复制,通过将binlog传给其他数据库副本,然后再执行binlog中的sql实现数据的同步,构建出一套高可用的数据库服务。可以查看日志是否开启。

xsgnzb的专栏 1755

【自动驾驶轨迹规划之hybrid A*算法】

本文参考论文:https://ai.stanford.edu/~ddolgov/papers/dolgov_gpp_stair08.pdf 这篇文章是基于经典A*算法与reeds-shepp曲线的,不清楚的读者请参考【自动驾驶轨迹规划5之A*算法】_无意2121的博客-优快云博客【自动驾驶轨迹规划之dubins曲线与reeds-shepp曲线】_无意2121的博客-优快云博客 目录 1 hybrid A* 算法创新点 1.1 搜索方式 1.2 车辆运动学模型 1.3 reeds-shepp曲

weixin_65089713的博客 1万+

mysql select for_MySQL数据库select for update探究

针对select for update的原理,在网络上有很多文章都有讲过,具体的用法也有文章进行讲解,其中也不乏一些优秀的文章。但是针对于具体的使用中的表现并没有太多。本篇博客以select for update与update的执行表现为例,记录实际使用过程中的心得。本篇不讲原理,只讲表现。阅读必知使用sql命令窗口一,执行select for update,关闭事务的自动提交,模拟在系统中开启了...

weixin_30421223的博客 1640

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

解决MySQL事务未提交导致死锁报错 避免死锁的方法

解决mysql 事务未提交导致死锁报错:        当 sessionA 尝试修改 B 表数据,因为 sessionB 当前为锁定状态,而且 sessionB 对 B 表中数据具有锁定状态中,则出现死锁。sessionB 会自动终止尝试修改 A 表数据事务, 两个事务操作都被终止,并返回下面错误信息。ERROR 1205 (HY000): Lock wait timeout exceeded;...

许恒的博客 2万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

mysql查看未提交的事务进程

查询 正在执行的事务: SELECT * FROM information_schema.INNODB_TRX 查看正在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;  查看等待锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 有时候代码里运行

emoers的博客 2万+

mysql事务未提交断开连接_与数据库连接异常断开导致事务没提交怎么办

本帖最后由 P-Linux 于 2011-12-25 00:58 编辑我们经常遇到一个情况,就是网络断开或程序Bug导致COMMIT/ROLLBACK语句没有传到数据库,也没有释放线程,但是线上事务锁定等待严重,连接数暴涨,尤其在测试库这种情况很多,线上也偶有发生,于是想为MySQL增加一个杀掉空闲事务的功能。那么如何实现呢,通过MySQL Server层有很多不确定因素,最保险还是在存储引擎层实...

weixin_42314420的博客 3416

二.事务.

事务就是保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的。MySQL是一个多引擎的系统,并不是所有的引擎都支持事务。 事务具有ACID属性(Atomicity,Consistency,Isolation,Durability;原子性,一致性,隔离性,持久性)。 当数据库上有多个事务同时执行的时候,就可能出现脏读,不可重复读,幻读的问题。为了解决这些问题,就有了隔离级别的概念。事务隔离级别包括读未提交(read uncommited),读提交(read commited

Tyella的博客 322

mysql怎么终止一个事务_用户如何明确终止当前的MySQL事务?

以下是可以明确结束当前MySQL事务的方法-通过COMMIT命令如果我们将运行COMMIT命令,则当前事务将明确结束。在这种情况下,更改将被提交。示例mysql>STARTTRANSACTION;mysql>INSERTINTOMarksValues(1,'Aarav','Maths',50);mysql>INSERTINTOMarksValues(2,'...

weixin_29479879的博客 5726

MySQL的事务隔离级别是什么?

????我是平也,这有一个专注Gopher技术成长的开源项目「go home」 背景介绍 想必事务大家都已经非常熟悉了,它是一组SQL组成的一个执行单元,要么全执行要么全不执行,这也是它的一个特性——原子性。而事务的应用场景也非常广泛,最经典的就是转账问题,A给B打钱,不能出现A钱扣了B还没收到的状况,否则业务就乱套了。 事务的特性 于是呢,根据用户对这些场景的严苛要求,总结出了事务应该具备的四个...

了不起的厂长 1253

mysql数据库删除未提交事务

导致事务长期未提交的因素很多,常见的有: 1、事务过程中执行其他非数据库操作,导致事务长期未被处理。 2、事务处理异常或实现逻辑有误,导致事务未被正常处理。 3、网段异常导致应用端请求未被正常发送给数据库,数据库等待应用后续操作。 4、应用服务器性能问题(如CPU爆满),导致应用无法及时切换到该进程进行处理。 1.使用如下命令查询出未提交事务 ## 查看未提交的事务(3秒内未操作的事务) SELECT p.ID AS conn_id, P.USER AS login_user, P.HOST AS lo

qq_17376623的博客 2009

mysql 事务_MySQL如何找出未提交事务信息

前阵子,我写了一篇博客“ORACLE中能否找到未提交事务的SQL语句”, 那么在MySQL数据库中,我们能否找出未提交事务执行的SQL语句或未提交事务的相关信息呢?实验验证了一下,如果一个会话(连接)里面有一个未提交事务,然后不做任何操作,那么这个线程处于Sleep状态mysql>selectconnection_id()fromdual;+--------------...

weixin_39885469的博客 603

MySQL 索引深入理解:B+ 树、二级索引、联合索引与查询优化

理解二级索引后,就可以理解回表了。SELECT *MySQL 的执行过程分为三个步骤。覆盖索引(Covering Index)并不是一种独立的索引类型,而是一种查询效果。SQL 查询需要的所有字段,都能够直接从某个索引中获得,不需要再访问聚簇索引获取其他字段。例如:因为user_id已经包含在二级索引中,所以 MySQL 可以直接返回结果。不需要回表。联合索引(Composite Index)是同时使用多个字段建立的索引。它的排序规则是:首先按照user_id排序。当user_id。

m0_64642997的博客 135

MySQL 单点详解(14)

给定一条 SQL,联合索引的列该怎么排呢?

2401_88601046的博客 345

Flink SQL 连接器实战:MySQL Source、Flink CDC 与 JDBC Sink 全解析

提供有界流读取,适合批处理和维表场景,简单直接但无法感知变更。MySQL CDC提供无界流读取,通过「全量快照 + binlog 增量」的方式实现实时捕获,是实时数仓的核心入口,但需要 MySQL 侧正确配置 binlog 和权限。JDBC Sink负责结果回写,关键在于区分仅插入流和更新流,更新流必须依赖主键完成 upsert。掌握这三者的差异,本质上就是掌握了 Flink 中「有界与无界」「追加与更新」这两组最基本的语义。

2401_83857914的博客 453
上一篇: mysql-210713-01
下一篇: mysql-执行顺序
白光一
博客等级 码龄9年 0粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值