一、事务描述
1、事务的四个特性 ACID
  1. A:原子性 = 一个事务或者都成功、或者都失败;
  2. C:一致性 = 在整个事务的生命周期里面,查询到的数据是一致的;
    MVCC多版本并发控制:利用undo保存某一时刻数据快照,通过版本号来减少锁的争用,保证各个事务互不影响。
  3. I:  隔离性 = 隔离级别;
  4. D:持久性 = 只要事务commit,这个事务不会因为系统的崩溃而丢失;
  持久性和原子性对于所有的支持事务的数据库都是一样的,都满足。
2、常见事务格式
start transaction;
  DML ( insert; delete; update; )
commit;
3、MySQL 默认每一条 DML 是一个事务
  通过参数 'autocommit' 进行控制是否默认提交事务;
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.01 sec)

  SQL 自动提交开启,有一定的危险性(没有 rollback )。

  墙裂推荐:关闭 SQL 的自动提交;
  血泪教训:曾经自信过了头的一次 sitesup (其实也是有反复确认),同时疏忽了备份,命令行下一个回车敲下去,发现问题大发了……所以,备份 + 显式 Commit 很重要。
4、大事务+长事务
  数据库的大事务和长事务会带来undo的持续增加、undo暴增,空间不可复用;
  事务信息表:information_schema.INNODB_TRX,用来查看长事务、大事务。
5、空闲事务+锁
start transaction;
  update;
  ……    // 空闲等待,时间可能不可控
  ……    // 空闲等待
  update;
commit;
  1. 事务和事务锁有一定的关系:事务不提交、行锁就不会释放、事务锁就不会消失
  2. 死锁:是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种相互等待的现象。死锁出现的概率是非常低的,因为innodb内置有死锁检查机制,当出现死锁时会自动回滚占用undo资源少的事务。
 
二、事务隔离级别
0、隔离性
  1. MySQL 有多个隔离级别,可以调整,隔离性越弱并发性越好;
  2. 每个数据库都有自己默认的隔离级别
mysql> show variables like '%iso%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.01 sec)

  会话级别设置:set @@session.tx_isolation=……

1、READ-UNCOMMITED
  未提交读,隔离性最弱,但并发性最好;
  事务中的修改,即使没有提交,对其他事务也都是可见的,也就是说事务可以读取未提交的数据,读到脏数据(脏读,dirty read);
2、READ-COMMITED
  大部分数据库系统的默认隔离级别都是READ-COMMITED,但MySQL不是;
  1. 提交读,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的;
  2. 不可重复读,在同一个事务中,同一个SQL执行多次(该记录修改事务提交前、提交后),得到的结果可能不同:幻读;
3、REPEATABLE-READ
  可重复读,MySQL默认隔离级别;
  在同一个事务中,同一个SQL执行多次,得到的结果是相同的;
  1. 对于普通 select 来说,通过 MVCC 来实现,解决脏读问题、幻读问题;
  2. 对于 dml、select for update,通过范围锁实现,解决幻读问题;
4、SERIALIZABLE
  (serializable 连载、串行化) 隔离性最高,没有并发;
  对于同一个数据来说,在同一个时间段内,只能有一个会话可以访问,包括select和dml,通过执行事务串行执行,避免幻读问题;
  也就是说,对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
  注意:业务有串行化的需求,但是我们不会设置数据库事务为串行化隔离级别,而是在应用端设置解决(例:U盾)。

【不错】MySQL 事务隔离级别的更多相关文章

  1. [51CTO]新说MySQL事务隔离级别!

    新说MySQL事务隔离级别! 事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!本文所讲大部分内容,皆有官网作为佐证,因此对本文内 ...

  2. 查询mysql事务隔离级别

    查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava   1.查看当前会话隔离 ...

  3. MySQL事务隔离级别测试实例

    https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...

  4. Mysql事务-隔离级别

    MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...

  5. MySQL事务隔离级别 解决并发问题

    MySQL事务隔离级别 1. 脏读: 骗钱的手段, 两个窗口或线程分别调用数据库转账表,转账后未提交,对方查看到账后,rollback,实际钱没转. 演示方法: mysql默认的事务隔离级别为repe ...

  6. mysql事务隔离级别、脏读、幻读

    Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...

  7. mysql事务隔离级别与设置

    mysql数据库,当且仅当引擎是InnoDB,才支持事务: 1.隔离级别 事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repe ...

  8. MySQL事务隔离级别(二)

    搞清楚MySQL事务隔离级别 首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB).表的结构如下: 为了说明问题,我们打开两 ...

  9. MySQL事务隔离级别(一)

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...

  10. 面试突击61:说一下MySQL事务隔离级别?

    MySQL 事务隔离级别是为了解决并发事务互相干扰的问题的,MySQL 事务隔离级别总共有以下 4 种: READ UNCOMMITTED:读未提交. READ COMMITTED:读已提交. REP ...

随机推荐

  1. 安装wordpress的过程

    1 首先安装lamp.在安装php时,由于ubuntu16.04源中自带的是php7,所以需要直接安装 apt-get install phpapt-get install libapache2-mo ...

  2. Qualcomm_Mobile_OpenCL.pdf 翻译-10-总结

    这篇文档主要是介绍了关于在Adreno GPUs上优化OpenCL代码的详细方法.文档中提供的大量信息能够帮助开发者理解OpenCL基础和Adreno结构,还有最重要的,掌握OpenCL优化技能. O ...

  3. http与tcp

    一.基本概念 1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别” ...

  4. mysql:You can't specify target table 'sessions' for update in FROM clause

    更新数据时,在where条件子句里面如果想使用子查询按条件更新部分数据,需要将查询的结果设为临时表.可以参考: https://blog.csdn.net/poetssociety/article/d ...

  5. 安装 mysql odbc连接器

    下载地址: https://dev.mysql.com/downloads/connector/odbc/ 可以选择旧版本的下载 一. 配置数据源 1. 安装后如果找不到软件可以按  win键 后 输 ...

  6. HttpClient——ESP8266HTTPClient库

    针对Http请求操作的库,ESP8266HTTPClient库不属于ESP8266WiFi库的一部分,所以需要引入  #include <ESP8266HTTPClient.h> HTTP ...

  7. Redis(一)

    1 单机MySQL的美好时代2 Memcached(缓存)+MySQL+垂直拆分3 MySQL主从读写分离4 分库分表+水平拆分+mysql拆分5 MySQL的扩展瓶颈6 为什么使用NoSQLNoSQ ...

  8. 【ZJOJ1321】灯

    题目 贝希和她的闺密们在她们的牛棚中玩游戏.但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了.贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗中,她感到惊恐,痛苦与绝望.她希望您能够帮帮她 ...

  9. 部署zabbix 4.0 + grafana

    不完整,仅供参考 Zabbix+grafana监控部署 基本环境 系统: CentOS Linux release 7.3.1611 Zabbix—server:  Zabbix_agent:   N ...

  10. Codecombat 游戏攻略(计算机科学三)2

    第33关 逻辑之路 判断secretB 非真,走上面:否则,走下面(这里面要先自己进行逻辑判断)if…else语句或者这样用(不用自己进行判断) // 如果 secretB 非真,走上面:否则,走下面 ...