谈到事务,首先想到的问题是并发控制。比如两个用户同时操作数据库里面的一张表,一个正在读数据,一个正在删除数据,那么读数据的读出的结果究竟是多少?并发可以提高系统的性能,让多个用户同时操作一份数据,但为了数据的有效性,必须进行并发控制。并发控制的目的就是使得一个进程的操作不会影响另一个进程的操作。有很多并发控制的机制,最简单的机制就是锁,分为读锁(共享锁)和写锁(独占锁),关于锁的使用可以使用mysql > help lock  查看。锁粒度从大到小分为:表锁,页锁,行锁。mysql服务器仅支持表锁,行锁需要存储引擎的支持才能使用。除了锁,另一个并发控制的工具是多版本并发控制 (MVCC)了,它的原理简单来说就是当多个用户同时操作一份数据时,每个人操作的都不是源数据而是数据的一个副本(快照),最后完成快照的合并,具体的原理也不是一两句话就可以说得清的。还有一些并发控制的手段如:时间戳,多版本和快照隔离....

  言归正传,在RDBMS中,事务必须要保证数据文件的ACID:

  Atomicity                原子性          由初中物理知识,原子是不可分的(后来好像被夸克推翻了),简言之,事务引起的一系列操作要么全部完成要么全部不完成,不能一部分完成一部分失败。

Consistency          一致性           事务操作前后的系统状态是不变的,比如转账的时候,甲给乙转账5000,那么甲的账户少了5000,乙的账户必须多5000。不能出现甲的账户少了,乙的账户没多,或者甲的账没少但乙的账户多了的情况出现。

  Isolation              隔离性           牵扯到事物的隔离级别,下文论述。

Durability            持久性

mysql事务的隔离级别分为4级别:

READ-UNCOMMITED      读未提交       甲执行一个事务操作一张表,还未提交事务,表中的改变乙就可以看到,隔离级别最低。

  READ-COMMITTED         读提交          甲执行一个事务,在未提交事务之前,表中的改变已是看不到的,甲提交后,已就可以看到变化隔离级别稍稍变高。

  REPATABLE-READ           可重读          只要自己不提交事务,无论别人怎么修改表都不会影响自己的数据,隔离级别很高了,但是仍有幻读的现象发生。

  SERIABLIZABLE                可串行         几个人同时操作一张表,必须等一方提交事务之后,下一个才能继续操作,隔离级别最高,但并发能力大大减弱。

在这几个隔离级别中,隔离级别越高,并发能力就越弱,除非在银行和金融等领域,否则不建议采用较高的隔离级别,这样会使系统的并发能力大大下降,我们必须在隔离级别和并发能力两者之间妥协折中,选择最合适的隔离级别。在mysql中可以使用 mysql> SHOW GLOBAL VARIABLES LIKE "%iso%"; 查看mysql的事务的隔离级别,在我的mysql服务器上结果是:REPEATABLE-READ  可重读.

    -> ;
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
row in set (0.00 sec)

如果要改变事务的隔离级别,执行 mysql>SET tx_isolation='READ-UNCOMMIT'; 或者在mysql的配置文件中修改.

一个事务的执行过程大概是这样的:

mysql> START  TRANSACTION;     启动事务
mysql> sql语句
mysql> sql语句
mysql> sql语句
...........
mysql> COMMIT 提交事务,一旦提交代表事务已经完成,所有sql语句全部生效或者失败 或者 myslq>ROLLBACK 回滚,之前所有执行的sql语句全部失效

mysql事务还支持保存点,可以回滚到保存点时候的状态

mysql>START  TRANSACTION;
mysql>DELETE FROM tutors WHERE Tid=30;
mysql>SAVEPOINT aa; 注意保存点不能使用数字
mysql>DELETE FROM tutors WHERE Tid=14;
mysql>SAVEPOINT ab; mysql指令不区分大小写
mysql>DELETE FROM tutors WHERE Tid=18;
mysql>SAVEPOINT ac;
mysql>ROLLBACK TO ab; 回滚到ab那个点的状态
mysql>COMMIT; 提交事物,ab点之前的所有sql语句生效

在mysql中有一个服务器变量autocommit可以用来查看有没有明确指定事务自动提交,可以用指令查看

myslq> SELECT    @@automit;
或者
mysql> show variables like "%autocommit%";

在我的Mysql服务器上,没有关闭自动提交

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
row in set (0.00 sec)

建议明确使用事务,关闭自动提交!因为,如果开启autocommit,那么每执行一次sql语句就会提交一次,每次提交都会产生一次磁盘IO,这样会导致系统性能下降,任何产生IO的地方都会导致系统性能下降.因为内存的速度和机械硬盘的速度相差了n个数量级.使用指令

mysql>SET autocommit=OFF: 关闭事务自动提交,或者在配置文件中/etc/mysql/my.cnf(不同发行版编译的结果可能不一样)中的[mysqld]段加上autocommit = OFF.

最后,事务的状态分为:

活动的

部分提交的

失败的

中止的

提交的

mysql事务和并发控制的更多相关文章

  1. 深入理解 MySQL ——锁、事务与并发控制

    本文首发于vivo互联网技术微信公众号 mp.weixin.qq.com/s/JFSDqI5ya… 作者:张硕 本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结, ...

  2. [转帖]2019-03-26 发布 深入理解 MySQL ——锁、事务与并发控制

    深入理解 MySQL ——锁.事务与并发控制 https://segmentfault.com/a/1190000018658828 太长了 没看完.. 数据库 并发  mysql 639 次阅读   ...

  3. [转帖]深入理解 MySQL—锁、事务与并发控制

    深入理解 MySQL—锁.事务与并发控制 http://www.itpub.net/2019/04/28/1723/ 跟oracle也类似 其实所有的数据库都有相同的机制.. 学习了机制才能够更好的工 ...

  4. 深入理解Mysql——锁、事务与并发控制

    本文对锁.事务.并发控制做一个总结,看了网上很多文章,描述非常不准确.如有与您观点不一致,欢迎有理有据的拍砖! mysql服务器逻辑架构 每个连接都会在mysql服务端产生一个线程(内部通过线程池管理 ...

  5. MySQL事务内幕与ACID

    MySQL的事务实现严格遵循ACID特性,即原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability).为了避免一上来就陷入对ACID ...

  6. MYSQL事务及存储引擎对比

    Innodb支持事务,而myisam不支持事务. 事务的定义: 当多个用户访问同一份数据时,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据的更新从一个一致性状态变更为另一个一致性 ...

  7. MySQL(十三)之MySQL事务

    前言 这段时间自己会把之前学的东西都总结一遍,希望对自己以后的工作中有帮助.其实现在每天的状态都是很累的,但是我要坚持! 进入我们今天的正题: 为什么MySQL要 有事务呢?事务到底是用来干什么的?我 ...

  8. MySQL事务与锁

    MySQL事务与锁 锁的基本概念 锁是计算机协调多个进程或线程并发访问某一资源的机制. 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISA ...

  9. MySQL事务以及隔离级别

    前言: 我一直想不到一个好的标题应该怎么写.我想MySQL的一些重要的内容.我在两次面试中都遇到过的,但直接用MySQL标题好像又不太贴切.干脆就是所写的内容吧. MySQL事务: transacti ...

随机推荐

  1. jQuery的选择器中的通配符使用介绍

    $("input[id^='data']");//id属性以data开始的所有input标签 $("input[id$='data']");//id属性以dat ...

  2. 因为换工作,需要学习CCNA的课程

    听说集齐7个CCIE就可以召唤神龙,不知道是不是真的,从CCNA开始吧! 加油!!!

  3. CSU-1632 Repeated Substrings (后缀数组)

    Description String analysis often arises in applications from biology and chemistry, such as the stu ...

  4. 『U3D学习』破坏神回忆图<一>任务系统

    学习资料:siki老师<泰斗破坏神> 联系QQ:1790555618 功能描述:任务面板内容生成,角色进行任务,自动寻路到指定地点. 从今天起,本人会发学习回忆图,先总结开发阶段功能,后续 ...

  5. [BZOJ 3191][JLOI 2013]卡牌游戏

    觉得这题很有必要讲一下! 现在发现在做概率题,基本是向 dp 和 马尔可夫链 靠齐 但是这一题真是把我坑了,因为状态太多,马式链什么的直接死了 我一开始的想法就是用 f[i][j] 表示剩余 i 个人 ...

  6. 【HDU1960】Taxi Cab Scheme(最小路径覆盖)

    Taxi Cab Scheme Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  7. [Linux] - Docker pure-ftp使用

    Docker使用pure-ftp的方法及配置 1.用docker下载pure-ftp docker pull stilliard/pure-ftpd:hardened 2.下载完后直接运行 docke ...

  8. Jquery 防止页面刷新

    1.禁止鼠标右键功能$(document).ready(function() { $(document).bind("contextmenu",function(e) { aler ...

  9. Linux--01入门

    一.远程控制台 Linux和windows不太一样,win系列默认都有桌面,我们买了服务器,一般都用远程桌面去连接. 而linux一般都是为了追求低成本或者高性能,可能我们就不需要桌面了,所以使用命令 ...

  10. 协程、异步IO

    协程,又称微线程,纤程.英文名Coroutine,协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器 ...