1  概述

事务是指一组原子性的SQL查询、或者是一个或多个SQL语句组成的独立工作单元;MyISAM不流行的原因很大是因为其不支持事务的处理功能。

2  事务日志

事务日志定义属性,有些参数可以运行时修改,写入在配置段里,事务日志相当于是中间的辅助功能,而且很关键。

事务日志表示把操作过程一笔一笔记录下来。如某个线程要对某个行操作,数据库会先保留老版本于事务日志中,对文件的写入,新版本的内容是先写入到日志里,提交前,数据在日志文件中,而不是在数据文件中,提交操作执行后,才将新旧版本的日志清除。

执行事务时,每个操作都需要从内存读入到日志中

事务日志主要是为了加速操作,同时为了辅助提交数据的功能,将随机写操作转换为顺序写操作

事务日志必须是固定大小,一般是有两个空间,一旦一个空间满了,就写入磁盘,另一个空间开始写入。轮替工作。

为了避免事务日志所在的磁盘,因硬盘故障导致破坏,可以用raid或者镜像组同步写入两份文件,保证了冗余,实现数据安全

以下是配置文件里事务日志的相关参数:

innodb_log_files_in_group:表示一组内有几个文件,一般要有两个

innodb_log_group_home_dir:指明家目录

innodb_log_file_size:指定日志文件的大小,默认5M

innodb_mirrored_log_groups:日志组有几个

3  ACID测试

如果一个存储引擎支持事务,那么关系型数据库就必须满足ACID测试:而非关系型数据库是base(碱性的单词)

A:AUTOMICITY,原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚到开始处;

C:CONSISTENCY,一致性;数据库总是应该从一个一致性状态转为另一个一致性状态;

I:ISOLATION,隔离性;一个事务所做出的操作在提交之前,是否能为其它事务可见;出于保证并发操作之目的,隔离有多种级别; 隔离如果做得严格,可能导致串行执行,而失去了并发执行的意义。有四个级别,隔离性最低,并发性最高,隔离性最高,安全性也最高,但是并发性就最低。可以根据安全性和服务器的并发性选择一个合适的方案。

D:DURABILITY,持久性;事务一旦提交,其所做出的修改会永久保存;

4  事务控制

自动提交:单语句事务,影响性能

mysql> SELECT @@autocommit;#查看自动提交功能参数

mysql> SET @@session.autocommit=0;#关闭自动提交功能后需要手动控制事务

手动控制事务,事务一旦提交,就不能回滚:

启动事务:START TRANSACTION

提交事务:COMMIT

回滚事务:ROLLBACK

事务支持savepoints:保存点,相当于是虚拟机的快照

SAVEPOINT identifier#创建保存点

ROLLBACK [WORK] TO [SAVEPOINT] identifier #还原到某个保存点

RELEASE SAVEPOINT identifier#销毁savepoint

例子

MariaDB [sunny]> insert into classlist values ("su",10,"91"),("chen",18,"88");MariaDB [sunny]>

#创建保存点first

MariaDB [sunny]> savepoint first;

MariaDB [sunny]> update classlist set name=ghbsunny where nu=1;

#创建保存点second

MariaDB [sunny]> saveponit second;

如果不修改nu=1的name值,此时执行

MariaDB [sunny]> rollback to first;

#注意,执行完 rollback to first保存点second就不存在了,因为在保存点first的时候,second还没创建。一旦执行了commint后,就不能rollback

#销毁保存点first

MariaDB [sunny]> release savepoint first;

5  事务隔离级别

级别由低而高,最高级别是串行化。隔离性越来越好,但是并发性降低。低级别的事务一定有高级别的问题

mysql数据库默认是第三隔离级别REPEATABLE-READ,其他数据库一般默认第二级别READ-COMMITTED,所以mysql建议也修改为第二级别的READ-COMMITTED

查看当前会话级定义的事务隔离级别

MariaDB [sunny]> select @@session.tx_isolation;

mysql有四个隔离级别,如下:

READ-UNCOMMITTED:

读未提交 --> 容易导致脏读,不被确认的结果也可能被读取;即没有提交的情况下,别人也可以看到未提交的更新的记录

例子:打开两个crt窗口,登录mysql,分别关闭自动提交功能和设置隔离级别为READ-UNCOMMITTED

MariaDB [sunny]> SET @@session.autocommit=0;

MariaDB [sunny]> set @@session.tx_isolation="READ-UNCOMMITTED";

MariaDB [sunny]> start transaction;

在窗口1上执行

MariaDB [sunny]> update classlist set name="bf" where nu=10;

此时,窗口1没有执行commit,但是在窗口2上能够看到已经更新后的数据,即窗口2上执行如下语句,看到nu=10的name已经更改为bf了,即窗口2可以随时看到窗口1的任何修改

MariaDB [sunny]> select * from classlist where nu=10;

+------+----+-------+

| name | nu | score |

+------+----+-------+

| bf   | 10 | 91.00 |

+------+----+-------+

READ-COMMITTED:

读提交--> 读别人确认的数据,可能导致不可重复读的问题,可能多次读的结果不一样;

例子:打开两个crt窗口,登录mysql,分别关闭自动提交功能和设置隔离级别为READ-COMMITTED

MariaDB [sunny]> SET @@session.autocommit=0;

MariaDB [sunny]> set @@session.tx_isolation="READ-COMMITTED";

MariaDB [sunny]> start transaction;

在窗口1上执行

MariaDB [sunny]> delete from classlist where nu=1;

此时,窗口1没有执行commit操作,窗口1上查看到的nu=1已经被删除,但是查看2还是可以看到nu=1的记录

窗口2上执行如下

MariaDB [sunny]> select * from classlist where nu=1;

+-------+----+--------+

| name  | nu | score  |

+-------+----+--------+

| sunny |  1 | 100.00 |

+-------+----+--------+

1 row in set (0.00 sec)

窗口1上执行commit后,窗口2页查看不到记录

REPEATABLE-READ:

可重复读,mysql数据库默认的隔离级别 --> 导致幻读的问题,如别的事务已经修改过数据,但是看到的还是旧数据;

例子:打开两个crt窗口,登录mysql,分别关闭自动提交功能和设置隔离级别为READ-COMMITTED

MariaDB [sunny]> SET @@session.autocommit=0;

MariaDB [sunny]> set @@session.tx_isolation="REPEATABLE-READ";

MariaDB [sunny]> start transaction;

在窗口1上执行

MariaDB [sunny]> insert into classlist values ("mei",5,99);

此时还没commit,在窗口1上可以看到新增的数据,但是窗口2上看不到新增加的数据

在窗口1上执行

MariaDB [sunny]> commit;

此时,窗口1上任然可以看到新增加的数据,但是窗口2上看不到新增的nu=5的数据,

窗口2以为没有nu=5的数据,但是窗口2要插入nu=5的数据,会出现报错重复数据的提示

MariaDB [sunny]> insert into classlist values ("mei2",5,98);

ERROR 1062 (23000): Duplicate entry '5' for key 'PRIMARY'

MariaDB [sunny]> select * from classlist;

+----------+----+-------+

| name     | nu | score |

+----------+----+-------+

| sunny    |  1 | 98.00 |

| chao     |  3 | 98.00 |

| tracy su |  6 | 95.00 |

+----------+----+-------+

如果要看到新增的数据,窗口2可以退出sql窗口,重新登录,就可以看到新增nu=5的数据

SERIALIZABLE:

串行化,隔离度最高;只有对方的事务结束(要么commit,要么rollback),另一窗口才能执行对同一表格的操作

例子:打开两个crt窗口,登录mysql,分别关闭自动提交功能和设置隔离级别为READ-COMMITTED

MariaDB [sunny]> SET @@session.autocommit=0;

MariaDB [sunny]> set @@session.tx_isolation="SERIALIZABLE";

MariaDB [sunny]> start transaction;

在窗口1上执行如下语句,但是不执行commit;自己操作后,没有确认,则别人也不能查看该表,因为已经该表琐死。只能在自己提交会回滚后,别人才能查询到结果。

delete from classlist where nu=8;

此时在窗口2上执行如下语句,那么窗口2的查询结果就出不来,等待时间超时后,就会出现报错

MariaDB [sunny]> select * from classlist;

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

转载于:https://blog.51cto.com/ghbsunny/2060554

数据库 之 事务控制和隔离级别相关推荐

  1. 《MySQL》入门基础知识点大全:数据库操作、增删改查、联表查询、常用函数、MD5加密、事务特性、隔离级别

    MySQL基础知识大全 1.操作数据库 1.1 创建表 1.2 修改表名 1.3 增加表的字段 1.4 修改表的字段 1.4.1 修改表的字段 1.4.2 修改表名 1.5 删除表的字段 1.6 删除 ...

  2. MySql事务4种隔离级别以及悲观锁和乐观锁

    前言:在那鬼公司呆着发现自己居然把事务给搞明白了. 缘由:公司做的一个项目在进行首页内容显示的时候发现查询结果特别慢,有时候需要一到五分钟才能显示出结果.于是乎,我就顺着SQL语句查询慢的原因找了下去 ...

  3. 脏读、不可重复读 共享锁、悲观锁 和 事务五种隔离级别

    http://www.cnblogs.com/adforce/archive/2011/04/20/2021929.html 一.脏读.不可重复读.幻读 1.脏读:脏读就是指当一个事务正在访问数据,并 ...

  4. 【眼见为实】数据库并发问题 封锁协议 隔离级别

    目录 序 数据库并发的几大类问题 ①丢失修改(Lost Update) ②不可重复读(Non-Repeatable Read) ③幻读(Phantom Read) ④读脏数据(Dirty Read) ...

  5. 一文彻底读懂MySQL事务的四大隔离级别

    前言 之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够深入,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~ 事务 什么是事务? 事务,由一个有限的数据库操 ...

  6. MySQL事务原理之事务概述和隔离级别

    MySQL事务概述和隔离级别 事务 事务的特征 事务的控制语句 事务的生命周期 事务执行过程 ACID特性 原子性(A) 一致性(C) 隔离性(I) 持久性(D) 隔离级别 命令 不同隔离级别并发异常 ...

  7. MySQL 之事务 及 其隔离级别

    MySQL 之事务 及 其隔离级别 /* 事务:表示一组操作(sql),要么同时成功,要么同时失败,那么这种操作就构成了一个事务. 例如: 张三 给 李四 转账 500元 (1)把张三的余额减少500 ...

  8. 数据库事务4种隔离级别和7种传播行为

    一.数据库隔离级别:是在在数据库操作中,为了有效保证并发读取数据的正确性提出的. 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大.对于多数应用程序,可以优先考虑把数据库系统的隔 ...

  9. MySQL--新手必备SQL基础知识、事务ACID及隔离级别

    ❤️‍您好,我是贾斯汀,本文主要分享数据库的一些基础知识!❤️‍ SQL 什么是SQL? [百度百科] 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的 ...

最新文章

  1. 页面与页面之间传递参数
  2. pyqt5讲解4:QDialog,QMessageBox,QInputDialog,QFontDialog,QFileDialog
  3. 多亏了这篇文章,我的开发效率远远领先于我的同事
  4. 如何在openGauss 2.1.0中使用Job?
  5. 不用计算机怎么连接无线,不用电脑可以装wifi吗 不通过电脑装wifi方法【图文】...
  6. Linux集群:LVS搭建负载均衡集群(二)
  7. 高质量Python书籍推荐丨Python学习手册(第5版)
  8. Google 字体在前端开发中的使用
  9. kettle下载安装和连接
  10. win7家庭版计算机桌面,Win7 home basic家庭普通版显示桌面图标的方法
  11. 如何在机智云开发平台快速创建具有商用租赁效果的硬件产品
  12. [内网渗透]—NetLogon 域内提权漏洞(CVE-2020-1472)
  13. java中的12的意思_在外壳中,“ 2&1”是什么意思?
  14. 博客园Markdown排版技巧
  15. 关于ISO七层模型你应该知道的东西
  16. Elixir-Tuples
  17. MicroServices(5)---DevOps用户手册
  18. 诛仙手游-法宝血炼性价比分析
  19. 市场观察:130个智慧消防中标项目分析
  20. NXP(Freescale) QorIQ T2080 u-boot与linux内核移植

热门文章

  1. wifi芯片_全新蜕变!康希通信第四代WIFI 6 FEM芯片将于2020年Q1量产
  2. linux drbd同步,DRBD数据镜像主备节点同步数据
  3. selenium使用TestNG实现DDT
  4. eclipse工程运行正常但是工程有红叉的问题
  5. mysql主从安装配置_mysql主从安装配置
  6. linux输入法没有候选,fcitx中文输入法没有备选框
  7. Python编程基础13:文件读写操作
  8. C ++ 类 | 类的辅助函数(Helper Functions) ,类与数组_3
  9. bzoj4819 [Sdoi2017]新生舞会 分数规划(实数二分)+网络流检验
  10. 2017.10.17 Codechef MARCH14 GERALD07加强版 失败总结