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---事务的更多相关文章

  1. Hadoop生态组件Hive,Sqoop安装及Sqoop从HDFS/hive抽取数据到关系型数据库Mysql

    一般Hive依赖关系型数据库Mysql,故先安装Mysql $: yum install mysql-server mysql-client [yum安装] $: /etc/init.d/mysqld ...

  2. 第二百八十六节,MySQL数据库-MySQL事务操作(回滚)

    MySQL数据库-MySQL事务操作(回滚) 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 举例:有这样一张表 从表里可以看出张 ...

  3. MongoDB 与传统关系型数据库mysql比较

    与关系型数据库相比,MongoDB的优点: 转载自  http://blog.sina.com.cn/s/blog_966e430001019s8v.html①弱一致性(最终一致),更能保证用户的访问 ...

  4. 关系型数据库MySql简介

    什么是关系型数据库? 数据库就是用来存储数据的仓库,是一种特殊的文件. 根据存储的数据不同,划分为关系型数据库和非关系型数据库. 关系型数据库就是指 建立在关系模型基础上的数据库,通俗来讲这种数据库就 ...

  5. Flink RichSourceFunction应用,读关系型数据(mysql)数据写入关系型数据库(mysql)

    1. 写在前面 Flink被誉为第四代大数据计算引擎组件,即可以用作基于离线分布式计算,也可以应用于实时计算.Flink的核心是转化为流进行计算.Flink三个核心:Source,Transforma ...

  6. 数据库-mysql事务

    MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数 ...

  7. 关系型数据库MySQL多实例

    简介 MySQL数据库是一个中小型关系型数据库管理系统,软件开发者为瑞典MySQL AB公司.在2008年1月16号被Sun公司收购后Sun公司又被oracle公司收购.目前MySQL被广泛地应用在I ...

  8. Python3爬虫(九) 数据存储之关系型数据库MySQL

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 关系型数据库关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以关系型数据库的存储方式就是行列 ...

  9. sqlyog管理关系型数据库mysql数据库之sqlyog的安装管理

    .关系型数据库 有库有表,有关系 非关系型数据库  存储对象.集 下面的所有演示截图都是基不超过SQLyog 11进行的. 1. 2.点击上图中的应用程序,进行安装. 安装sqlyog , 账户dd0 ...

  10. 数据库 Mysql事务详解

    Mysql事务 mysql的事务默认是自动提交的,也就是你提交一个query,他就直接执行!我们可以通过 禁止自动提交 开启自动提交 //mysql事务 #include <stdio.h> ...

随机推荐

  1. p4322 [JSOI2016]最佳团体

    传送门 分析 我们不难发现这是一棵树 于是01分数规划然后树上dp即可 代码 #include<iostream> #include<cstdio> #include<c ...

  2. Entity Framework Code-First(20):Migration

    Migration in Code-First: Entity framework Code-First had different database initialization strategie ...

  3. js中使用Java的方式

    1. 使用DWR框架 2. 使用AJAX方式

  4. labview中的移位寄存器、循环隧道,自动索引隧道的区别

    对于循环结构(For 循环.while循环)而言,循环体内的数据域外部数据的传递是通过以下三种方式: 1.移位寄存器2.循环隧道3.自动索引隧道 第一.各自的区别.作用 循环隧道,就是把数据传入传出循 ...

  5. 值得细读!如何系统有效地提升Android代码的安全性?

    众所周知,代码安全是Android开发工作中的一大核心要素. 11月3日,安卓巴士全球开发者论坛线下系列沙龙第七站在成都顺利举办.作为中国领先的安卓开发者社区,安卓巴士近年来一直致力于在全国各大城市举 ...

  6. oracle sql 字段行转列

    数据库中原先如图: 现在要吧WHMM行转列: conncect by用于确定列的个数

  7. KMP算法不同写法之间区别

    网上之所以有这么多版本的KMP算法,是因为有的人写的是最大长度串版本的,有的人写的是next数组版本的(具体区别看下面博文),有的人写的是next优化版的,有的人写的是未优化的,不同人写的循环方法不同 ...

  8. CompressFormat压缩性能

    在产品应用场景内有个需求,Bitmap原图压缩保存.但是每次保存一个图片,需要500+ms.原本以为是sd卡写的慢.后来测试发现是图片压缩问题.试验过CompressFormat PNG和JPEG两种 ...

  9. 缩点【洛谷P1262】 间谍网络

    [洛谷P1262] 间谍网络 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他 ...

  10. 去除List集合中的重复值(四种好用的方法)

    最近项目中需要对list集合中的重复值进行处理,大部分是采用两种方法,一种是用遍历list集合判断后赋给另一个list集合,一种是用赋给set集合再返回给list集合. 但是赋给set集合后,由于se ...