MYSQL数据库之事务
ccwgpt 2024-11-25 10:23 78 浏览 0 评论
事务
DCL用来控制数据库的访问,包括如下SQL语句:
GRANT:授予访问权限
REVOKE:撤销访问权限
COMMIT:提交事务处理
ROLLBACK:事务处理回退
SAVEPOINT:设置保存点
LOCK:对数据库的特定部分进行锁定
1、事务
思考:我去银行给朋友汇款,我卡上有1000元,朋友卡上500元,我给朋友转账50元(无手续费),如果,我的钱刚扣,而朋友的钱又没加时,网线断了,怎么办?
1.1事务的ACID特性
原子性(Atomicity):原子意为最小的粒子,或者说不能再分的事物。数据库事务的不可再分的原则即为原子性。
组成事务的所有查询必须:要么全部执行,要么全部取消(就像上面的银行例子)。
一致性(Consistency):指数据的规则,在事务前/后应保持一致
隔离性(Isolation):简单点说,某个事务的操作对其他事务不可见的.
持久性(Durability):当事务提交完成后,其影响应该保留下来,不能撤消
1.2事务的用法
开启事务(start transaction)
执行sql操作(普通sql操作)
提交/回滚(commit/rollback)
注意:
l 建表的时候,选择 Innodb引擎才支持事务
默认情况下,MySQL是自动提交事务,每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚。如果某一组操作需要在一个事务中,那么需要使用start transaction,一旦rollback或commit就结束当次事务,之后的操作又自动提交。
如果需要在当前会话的整个过程中都取消自动提交事务,进行手动提交事务,就需要设置set autocommit = false;或set autocommit = 0;那样的话每一句SQL都需要手动commit提交才会真正生效。rollback或commit之前的所有操作都视为一个事务,之后的操作视为另一个事务,还需要手动提交或回滚。
和Oracle一样,DDL语句是不能回滚的,并且部分的DDL语句会造成隐式的提交,因此最好事务中不要涉及DDL语句。
#开启手动处理事务模式
#set autocommit = false;
#开始事务(推荐)
start transaction;
#查看当前表的数据
select * from t_stu_detail;
#删除整张表的数据
delete from t_stu_detail;
#查询该表数据,发现显示删除后的结果
select * from t_stu_detail;
#回滚
rollback
#查看当前表的数据,发现又回来了
select * from t_stu_detail;
#删除整张表的数据
delete from t_stu_detail;
#提交事务
commit;
#查看当前表的数据,发现真删除了
select * from t_stu_detail;
#插入一条记录
INSERT INTO t_stu_detail VALUES
(1, '123456789012345678', '1990-01-21', '12345678901', 'a@163.com', '北七家');
#保存还原点1
savepoint point1;
#插入一条记录
INSERT INTO t_stu_detail VALUES
(2, '123456789012345677', '1990-02-21', '12345678902', 'b@163.com', '北七家');
#保存还原点2
savepoint point2;
#查看当前效果
select * from t_stu_detail;
#回滚到某个还原点
rollback to point1;
#提交事务
commit;
#清空表
truncate t_stu_detail;
#回滚,对于truncate无法回滚
rollback;
#修改表结构
alter table t_stu_detail add description varchar(50);
#回滚,对于修改表结构的语句无法回滚
rollback;
1.3数据库的隔离级别
对于同时运行的多个事务(多线程并发), 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题: (问题的本质就是线程安全问题,共享数据的问题)
脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
不可重复读: 对于两个事务 T1, T2, T1 读取了一个字段, 然后 T2 更新并提交了该字段. 之后, T1再次读取同一个字段, 值就不同了.
幻读: 对于两个事务 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入、删除了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出、少了几行.
数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题。一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱。
Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED
Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE-READ
每启动一个 mysql 程序, 就会获得一个单独的数据库连接. 每个数据库连接都有一个变量 @@tx_isolation, 表示当前的事务隔离级别.
查看当前的隔离级别: SELECT @@tx_isolation;
查看全局的隔离级别:select @@global.tx_isolation;
设置当前 mySQL 连接的隔离级别: set tx_isolation ='repeatable-read';
设置数据库系统的全局的隔离级别: set global tx_isolation ='read-committed'; [I1]
隔离级别 | 描述 |
READ-UNCOMMITTED | 允许事务读取其他事务未提交的数据,脏读、不可重复读、幻读的问题都会出现 |
READ-COMMITTED | 只允许事务读取其他事务已经提交的数据,可以避免脏读,但是不可重复读、幻读的问题仍然会出现 |
REPEATABLE-READ | 确保事务可以多次从一个字段中读取相同的值,好比在事务开启时对现有的数据进行了拍照,其他事务对数据的修改,不管事务是否提交,我这里读取的是拍照下来的数据,可以避免脏读和不可重复读,但幻读的问题仍然存在。 注意:INNODB使用了MVCC (Multiversion Concurrency Control),即多版本并发控制技术防止幻读。真正的像拍照一样,其他事务新插入或删除的记录也看不出来。 |
SERIALIZABLE | 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新、删除操作,所有并发问题都可以避免,但是性能十分低下。 |
1.4示例演示
(1)脏读
脏读:进入餐厅发现“梦中情人”旁边座位已经有“帅哥”坐那儿了,正郁闷,打完饭,发现那个位置是空着的,又欣喜若狂,其实刚刚那个“帅哥”只是临时过去打个招呼。
客户端A却读取到B未提交的脏数据 | 客户端B还未提交 |
客户端A读取不到B未提交的脏数据 | 客户端B还未提交 |
(2)不可重复读
不可重复读:在图书馆门口,发现自己占的位置旁边有位“美女”,等刷完卡,兴冲冲的走到那儿,发现已经变成一“如花”了。
A客户端在同一个事务中,前后两次读取同一条记录,值不同 | B客户端提交了新修改的数据 |
A客户端在同一个事务中,前后两次读取同一条记录,值相同 | B客户端提交了新修改的数据 |
(3)幻读
大学考前画重点,老师说“第一章 xxxxxx概念”,你赶紧找,“天啊,在哪儿啊”,等你画完,就听老师说:“第四章xxxxx”,中间那些你都没听到。
A客户端在同一个事务中,对同一个表的查询记录数不相同 | B客户端事务删除了数据,并提交 |
A客户端在同一个事务中,对同一个表的查询记录数不相同 | B客户端事务添加了数据,并提交 |
(4)序列化
A客户端的事务级别是序列化,A客户端正在查看temp表 | B客户端想要多temp进行增、删、改操作不被允许 如果A客户端迟迟不结束事务,B客户端将会报 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction |
但是B客户端对A客户端未涉及的表不受影响
1.5锁
(1)行级锁
InnoDB的前三个隔离级别是行级锁
如果客户端A在对“id=6”的行进行修改 | B客户端如果也要对“id=6”的行进行修改将会出现等待 |
B客户端如果也要对“id=6”的以外行进行修改不用等
(2)表级锁
InnoDB事务隔离级别是序列化,将会发生整张表的锁
2、 分布式事务
减号不是下划线
相关阅读:
- 上一篇:第1章 Oracle 第一天
- 下一篇:分布式事务解决方案之2PC(两阶段提交)
相关推荐
- 5 分钟搭建 Node.js 微服务原型(node 微服务架构)
-
微服务已成为在Node.js中构建可扩展且强大的云应用的主流方法。同时也存在一些门槛,其中一些难点需要你在以下方面做出决策:组织项目结构。将自定义服务连接到第三方服务(数据库,消息代理等)处理微服...
- 当前的前端,真的不配叫程序员吗?
-
今天看到一个比较令人震惊的帖子,说前端不配叫程序员,令我很吃鲸,是谁我就不说了,帖子出处是一个大龄程序员组里面的,想想也不觉得奇怪了,毕竟对于年龄比较大的程序员来说,前端起步比较晚,最开始就是一个切图...
- 聊聊asp.net中Web Api的使用(asp.net core web api教程)
-
扯淡随着app应用的崛起,后端服务开发的也越来越多,除了很多优秀的nodejs框架之外,微软当然也会在这个方面提供更便捷的开发方式。这是微软一贯的作风,如果从开发的便捷性来说的话微软是当之无愧的老大哥...
- NodeJS中,listen Access:permission denied解决办法
-
错误描述:Win10系统,NodeJS程序。使用express框架开发的http服务器,启动时出现错误提示“listenAccess:permissiondenied"。错误原因:这是由于...
- Hono — 下一代高性能web框架(天融信下一代vnp)
-
最近公司可能要有变革,要统计我们的技能。真的是很无语,但是有没有办法。哎,问豆包吧提起Hono大家可能很陌生,这是什么?但是我提到Expressjs、nodejs想必前端小伙伴很熟悉啊。那么Hon...
- 生活例子说明线程,简单明了(列举一个日常生活中的例子以程序的形式表示)
-
1.程序设计的目标在我看来单从程序的角度来看,一个好的程序的目标应该是性能与用户体验的平衡。当然一个程序是否能够满足用户的需求暂且不谈,这是业务层面的问题,我们仅仅讨论程序本身。围绕两点来展开,性能...
- Node实战006:自定义模块的创建和使用详解
-
Node的应用是由模块组成的,每个文件的定义都是一个模块(module变量代表当前模块)并有自己的作用域。Node遵循commonjs的模块规范,用来隔离每个模块的作用域,使每一个模块在自身的命名空间...
- Node.js基本内容和知识点(node.js的概念)
-
简单的说Node.js就是运行在服务端的JavaScript,起初段定位是后端开发语言,由于技术的不够成熟,一般小型项目会完全使用node.js作为后台支撑,大项目中,运行不够稳定,不会轻易使用...
- 干货 | 如何利用Node.js 构建分布式集群
-
引言在软件定义的世界里,企业通过Web应用和移动应用程序来提供大部分的服务,Node.js迅速成为时下最为流行的一个平台之一,就和它可以搭建响应速度快、易于扩展的web应用和移动应用有很大关系,并凭...
- nodejs mongodb 实现简易留言板(node.js留言板)
-
一个朋友问了一下mongodb的一些操作问题我就做了下面这个简单的留言板给他做一个实例希望能帮助到他express的框架就不说了express的问题请移步nodejs之expressht...
- nodejs mqtt 智能售货机系统物联网控制系统源码分享
-
智能售货机系统(Moleintelligentvendingmachinesystem)是一套物联网控制系统性的解决方案。主要涉及到的语言和库有c,c++,js,nodejs,vue.js,...
- 为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?
-
说nodejs只是靠营销的是否太天真了些?当初nodejs出来的时候各种BUG,我简单的测试其大文件传输都会出现各种问题。而同時期的其他阵营早就甩其几条街了。但是为什么却能一直不断发展壮大?...
- 2020年14个最有用的NodeJS库(node用什么数据库)
-
Express快速,简单,极简的节点Web框架对…有好处·易于处理多种类型的请求,例如GET,PUT,POST和DELETE请求·快速构建单页,多页和混合Web应用程序每周下载1100万Lice...
- 连载:2016年最好的JS框架和库(下)
-
继续上一期的介绍:Agility.jsAgility.js是专为JS服务的MVC库,你可以免费编写可再用和可维护的浏览器代码,Agility支持Js,样式(CSS)、内容(HTML)和行为(JS)。C...
- awesome-nodejs 终极资源库:60K+星标的开发者宝藏
-
Node.js终极资源库:60K+星标的开发者宝藏引言在GitHub上,有一个备受瞩目的Node.js资源仓库,以其惊人的60.6k星标量和6kfork量,成为了Node.js开发者的必备参考。这个...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 5 分钟搭建 Node.js 微服务原型(node 微服务架构)
- 当前的前端,真的不配叫程序员吗?
- 聊聊asp.net中Web Api的使用(asp.net core web api教程)
- NodeJS中,listen Access:permission denied解决办法
- Hono — 下一代高性能web框架(天融信下一代vnp)
- 生活例子说明线程,简单明了(列举一个日常生活中的例子以程序的形式表示)
- Node实战006:自定义模块的创建和使用详解
- Node.js基本内容和知识点(node.js的概念)
- 干货 | 如何利用Node.js 构建分布式集群
- nodejs mongodb 实现简易留言板(node.js留言板)
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- java框架spring (43)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)