mysql事务和并发控制
谈到事务,首先想到的问题是并发控制。比如两个用户同时操作数据库里面的一张表,一个正在读数据,一个正在删除数据,那么读数据的读出的结果究竟是多少?并发可以提高系统的性能,让多个用户同时操作一份数据,但为了数据的有效性,必须进行并发控制。并发控制的目的就是使得一个进程的操作不会影响另一个进程的操作。有很多并发控制的机制,最简单的机制就是锁,分为读锁(共享锁)和写锁(独占锁),关于锁的使用可以使用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事务和并发控制的更多相关文章
- 深入理解 MySQL ——锁、事务与并发控制
本文首发于vivo互联网技术微信公众号 mp.weixin.qq.com/s/JFSDqI5ya… 作者:张硕 本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结, ...
- [转帖]2019-03-26 发布 深入理解 MySQL ——锁、事务与并发控制
深入理解 MySQL ——锁.事务与并发控制 https://segmentfault.com/a/1190000018658828 太长了 没看完.. 数据库 并发 mysql 639 次阅读 ...
- [转帖]深入理解 MySQL—锁、事务与并发控制
深入理解 MySQL—锁.事务与并发控制 http://www.itpub.net/2019/04/28/1723/ 跟oracle也类似 其实所有的数据库都有相同的机制.. 学习了机制才能够更好的工 ...
- 深入理解Mysql——锁、事务与并发控制
本文对锁.事务.并发控制做一个总结,看了网上很多文章,描述非常不准确.如有与您观点不一致,欢迎有理有据的拍砖! mysql服务器逻辑架构 每个连接都会在mysql服务端产生一个线程(内部通过线程池管理 ...
- MySQL事务内幕与ACID
MySQL的事务实现严格遵循ACID特性,即原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability).为了避免一上来就陷入对ACID ...
- MYSQL事务及存储引擎对比
Innodb支持事务,而myisam不支持事务. 事务的定义: 当多个用户访问同一份数据时,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据的更新从一个一致性状态变更为另一个一致性 ...
- MySQL(十三)之MySQL事务
前言 这段时间自己会把之前学的东西都总结一遍,希望对自己以后的工作中有帮助.其实现在每天的状态都是很累的,但是我要坚持! 进入我们今天的正题: 为什么MySQL要 有事务呢?事务到底是用来干什么的?我 ...
- MySQL事务与锁
MySQL事务与锁 锁的基本概念 锁是计算机协调多个进程或线程并发访问某一资源的机制. 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISA ...
- MySQL事务以及隔离级别
前言: 我一直想不到一个好的标题应该怎么写.我想MySQL的一些重要的内容.我在两次面试中都遇到过的,但直接用MySQL标题好像又不太贴切.干脆就是所写的内容吧. MySQL事务: transacti ...
随机推荐
- kernel/ptrace.c
/* ptrace.c *//* By Ross Biro 1/23/92 *//* edited by Linus Torvalds */ #include <linux/head.h> ...
- Linux Pthread 深入解析(转-度娘818)
Linux Pthread 深入解析 Outline - 1.线程特点 - 2.pthread创建 - 3.pthread终止 - 4.mutex互斥量使用框架 - ...
- Android学习
http://www.jikexueyuan.com/path/android 一.概述: 03年10月建立android科技,05年8月被google收购,07年11月成立开放手持设备联盟(Open ...
- fdisk,mount.label
########fdisk ll /dev/sda* df -TH fdisk -cul fdisk -cu ~~n~~p~~+1G~~ partx -a /dev/sda ########EXT4 ...
- break,continue的使用
break,continue 使用break命令允许跳出所有循环下面的例子中,脚本进入死循环直至用户输入数字大于5.要跳出这个循环,返回到shell提示符下,就要使用break命令. #!/bin/b ...
- CodeIgniter 开发,支付宝接口调用实例
准备:1.alipay官方下载最新接口类库2.解压后,将目录"\即时到账交易接口-create_direct_pay_by_user\demo\create_direct_pay_by_us ...
- atom 调用g++编译cpp文件
atom 有script插件可以直接调用很多编译器,试了很多次一直出问题找不到文件,查了文档之后发现script只支持OSX和linux. 所以,还是使用gpp-compiler比较靠谱 gpp-co ...
- IOS开发--自定义segment控件,方便自定义样式
系统的segment控件太封闭,想换个颜色加个背景太难了,忍不住自己写一个,以备不时之需 这个控件给出了很多自定义属性的设置,用起来还是比较方便的,需要注意的 itemWidth如果不设置,则会按照控 ...
- Sphinx的配置和使用
项目中用到了,昨天老大又给讲了讲,我感觉这玩意真是强大.想把一些功能以很小的代价做好,第三方的工具是必须要掌握的. 1. 我的开发环境在Windows上,下载了sphinx-2.2.6-release ...
- Mysql无法创建外键的原因
在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1. 两个字段的类型或者大小不严格匹配.例如,如果一个 ...