关系型数据库---MySQL---事务
1、概述
1.1 事务:在对业务相关的一系列数据进行操作时,需要保证数据操作的完整性(要么全部成功、要么全部失败);
1.2 MySQL中支持事务的存储引擎是:Innodb;
1.3 事务用来管理insert、update、delete语句;
1.4 事务必须满足的4个条件(ACID):
1.1.1 Atomicity(原子性)
一个事务的所有操作,要么全部成功、要么全部失败
1.1.2 Consistency(一致性)
在事务开始之前、事务结束之后,数据库的完整性没有遭到破坏
1.1.3 Isolation(隔离性)
数据库允许多个并发事务同时对数据进行读写和修改,隔离性可以防止多个事务执行时由于交叉执行而产生数据的不一致;
事务的隔离级别:读未提交read uncommitted、读提交read committed、可重复读repeatable read、串行化Serializable;
1.1.4 Durability(持久性)
事务处理完成后,对数据的修改是永久性的;
2、事务控制语句
begin(start transaction): 显示开启事务
commit(commit work): 事务提交(事务提交后对数据进行的修改称为永久性)
rollback(rollback work): 事务回滚(撤销之前对数据库的所有操作)
savepoint 保存点名称: 在事务中创建一个保存点(一个事务中可有多个savepoint)
release savepoint 保存点名称: 删除一个事务中的保存点(如果事务中不存在保存点,会抛出异常)
rollback to 保存点名称: 把事务回滚到保存点
set transaction: 设置事务的隔离级别(Innodb存储引擎支持的隔离级别:读未提交read uncommitted、
读提交read committed、可重复读repeatable read、串行化Serializable)
set autocommit=0 禁止事务自动提交(关闭自动提交后,从下一条指令开始开启新的事务,需要使用commit或rollback结束该事务)
set autocommit=0 开启事务自动提交
3、案例
【注意】:
默认情况下,每条SQL语句都可以视为一个事务,SQL执行完成后,自动执行commit;
通过begin或者set autocommit=0来禁止事务自动提交;
//每个命令后必须加分号,不然报语法错误
BEGIN;
INSERT INTO `user`(name,age) VALUES('lili',27);
INSERT INTO `user`(name,age) VALUES('lili',28);
ROLLBACK;
BEGIN;
INSERT INTO `user`(name,age) VALUES('lili',27);
INSERT INTO `user`(name,age) VALUES('lili',28);
COMMIT;
SET autocommit=0;
INSERT INTO `user`(name,age) VALUES('lili',27);
INSERT INTO `user`(name,age) VALUES('lili',28);
COMMIT;
4、并发事务 引起的问题:
脏读:
一个事务读取到了 另一个事务修改但是未进行事务提交的数据,一旦 另一个事务进行回滚,就会造成脏读;
案例:
左侧、右侧事务隔离级别设置为'read-uncommitted';
左侧手动开启事务,对id=1的数据进行更新,但未进行事务提交;
右侧对id=1的数据查询,会读取到左侧事务未提交的数据;
造成数据的脏读;

不可重复读:
一个事务执行相同的多次查询,但每次的结果都不一样,因为另一个并发事务在查询期间对数据作了修改;
案例:
左侧、右侧事务均设置为'read-committed';
左侧对id=1的数据进行更新, 并事务提交;
同时,右侧对id=1的数据查询,发现数据已经更新;
造成数据的不可重复读;

幻读:
一个事务执行相同的多次查询,发现每次查询的数量不一致,因为在查询时另一个并发事务对数据作了新增或者删除;
5、并发事务 隔离级别:

read uncommitted:
允许读取尚未提交的数据;
会造成脏读、不可重复读、幻读;
read committed:
允许读取已提交的数据;
会造成不可重复读、幻读;
repeatable read:(MySQL默认的隔离级别)
可重复读;
案例:
左侧、右侧隔离级别设置为'repeatable-read';
左侧手动开启事务,对id=1的数据进行更新,但事务未提交;
同时,右侧手动开启事务,进行id=1的数据读取;
解决了脏读的问题;

接上述;
左侧事务提交,id=1的数据更新为666;
右侧对id=1的数据进行查询,结果仍为600;
解决了不可重复读的问题;

接上述;
左侧新增一条数据,并自动进行事务提交;
右侧进行查询,发现没有读取到新增的数据(从快照中读取的,保证可重复读);
右侧对新增的数据进行更新,发现成功;
造成幻读;

Serializable:
最高的隔离级别,可防止脏读、不可重复读、幻读的发生;
性能比较低;
关系型数据库---MySQL---事务的更多相关文章
- Hadoop生态组件Hive,Sqoop安装及Sqoop从HDFS/hive抽取数据到关系型数据库Mysql
一般Hive依赖关系型数据库Mysql,故先安装Mysql $: yum install mysql-server mysql-client [yum安装] $: /etc/init.d/mysqld ...
- 第二百八十六节,MySQL数据库-MySQL事务操作(回滚)
MySQL数据库-MySQL事务操作(回滚) 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 举例:有这样一张表 从表里可以看出张 ...
- MongoDB 与传统关系型数据库mysql比较
与关系型数据库相比,MongoDB的优点: 转载自 http://blog.sina.com.cn/s/blog_966e430001019s8v.html①弱一致性(最终一致),更能保证用户的访问 ...
- 关系型数据库MySql简介
什么是关系型数据库? 数据库就是用来存储数据的仓库,是一种特殊的文件. 根据存储的数据不同,划分为关系型数据库和非关系型数据库. 关系型数据库就是指 建立在关系模型基础上的数据库,通俗来讲这种数据库就 ...
- Flink RichSourceFunction应用,读关系型数据(mysql)数据写入关系型数据库(mysql)
1. 写在前面 Flink被誉为第四代大数据计算引擎组件,即可以用作基于离线分布式计算,也可以应用于实时计算.Flink的核心是转化为流进行计算.Flink三个核心:Source,Transforma ...
- 数据库-mysql事务
MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数 ...
- 关系型数据库MySQL多实例
简介 MySQL数据库是一个中小型关系型数据库管理系统,软件开发者为瑞典MySQL AB公司.在2008年1月16号被Sun公司收购后Sun公司又被oracle公司收购.目前MySQL被广泛地应用在I ...
- Python3爬虫(九) 数据存储之关系型数据库MySQL
Infi-chu: http://www.cnblogs.com/Infi-chu/ 关系型数据库关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以关系型数据库的存储方式就是行列 ...
- sqlyog管理关系型数据库mysql数据库之sqlyog的安装管理
.关系型数据库 有库有表,有关系 非关系型数据库 存储对象.集 下面的所有演示截图都是基不超过SQLyog 11进行的. 1. 2.点击上图中的应用程序,进行安装. 安装sqlyog , 账户dd0 ...
- 数据库 Mysql事务详解
Mysql事务 mysql的事务默认是自动提交的,也就是你提交一个query,他就直接执行!我们可以通过 禁止自动提交 开启自动提交 //mysql事务 #include <stdio.h> ...
随机推荐
- EZOJ #78
传送门 分析 AC自动机板子题qwq 不过似乎可以哈希(因为所有模式串的长度相同,所以哈希乱搞就可以) 代码 #include<iostream> #include<cstdio&g ...
- 100198H Royal Federation
传送门 题目大意 国家有N个城市,任意城市可以到达任意城市,是一棵树.国王要给这些城市分省份.每个省份最少M个城市,最多3M个城市.每个省有一个首府,首府不一定是这个省的城市,只是首府到这个省各个城市 ...
- UVA1723 Intervals
这题$n$倍经验…… 考虑差分约束: 我们设$s_i$表示$[-1, i]$这个区间中数字的种类数,那么一个条件的限制相当于$s_{b_i} - s_{a_i - 1} \leq c_i$,那么连边$ ...
- 11.树形Model/View实例
任务1:显示如图的树形结构 思考: 1.使用QTreeView显示. 2.Model使用QStandardItemModel,qt的一个标准model. 3.QStandardItemModel下每一 ...
- 树莓派研究笔记(8)-- 编译lakka v2.1源码
Lakka越玩越觉得强大.如果要是能自己修改一下代码,实现自定义的一些操作就更好了.还可以修复字体文件,修复在部分机器上自动更换Mac地址导致ip变化的问题. 所以我们来尝试编译这个系统.这篇文章几乎 ...
- 关于C#中的算术运算
使用中间变量交换两个int型变量的值: ; ; a = a+b; b = a-b; a = a-b; 相信大家很容易写出来,但考虑到边界值情况时会有一些有趣的事情. 我们知道有一个int.MaxVal ...
- c#线程-线程同步
线程同步 上一篇介绍了如何开启线程,线程间相互传递参数,及线程中本地变量和全局共享变量区别. 本篇主要说明线程同步. 如果有多个线程同时访问共享数据的时候,就必须要用线程同步,防止共享数据被破坏.如果 ...
- Django之博客系统搭建一
前面已经介绍了django的各种用法,从这一章开始,将实际搭建一个blog系统. 首先我们需要设计blog的模型,在models.py中添加如下内容 # -*- coding: utf-8 -*- f ...
- 「BZOJ1010」[HNOI2008] 玩具装箱toy(斜率优化)
P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为 1⋯N1\cdots N1⋯N ...
- oracle小知识
设置显示执行时间 set timing on; 不显示:off 最简单的块: begin dbms_output.put_line('Hello,World'); end; 执行结果出现这种情况(执行 ...