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 ...
随机推荐
- 通过BroadCast与service时时监听网络变化
首先需要一个service: 这里我定义了一个NetworkStateService,在这个service中我写了一个BroadcastReceiver用于监听网络状态发生改变的情况并在这个servi ...
- C语言新文法
程序->外部声明 | 程序 外部声明 程序->外部声明A' A'->外部声明A'|ε 外部声明->修饰符 变量名 形参 修饰符->void | int | char | ...
- LeetCode-Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- NFS文件系统制作
内核: linux-3.0 u-boot: 2010.09 开发板: fl2440(s3c2440主芯片) 交叉编译器: 2011.11 ...
- 理解jquery的$.extend()、$.fn和$.fn.extend()
jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(); jQuery.extend(); jQuery.fn jQuery.fn = jQuery.prototype ...
- 如何写出优雅的CSS代码 ?(转)
对于同样的项目或者是一个网页,尽管最终每个前端开发工程师都可以实现相同的效果,但是他们所写的代码一定是不同的.有的优雅,看起来清晰易懂,代码具有可拓展性,这样的代码有利于团队合作和后期的维护:而有的混 ...
- python海龟图制作
海龟画图很好看,先上图形: 依据代码注释随意打印出来就行: #!/usr/bin/python3.4 # -*- coding: utf-8 -*- import turtle # 拿起一支笔 t = ...
- 关于分布式事务的一个误解:使用了TransactionScope就一定会开启分布式事务吗?
背景: 事务是数据库管理系统的一个基本概念,事务具有四个基本特点,即ACID:原子性(Atomicity).一致性(Consistency).隔离性(Isolation)和持久性(Durability ...
- getview不执行
<FrameLayout android:layout_width="match_parent" android:layout_height="match_pare ...
- Nginx快速入门菜鸟笔记
Nginx快速入门-菜鸟笔记 1.编译安装nginx 编译安装nginx 必须先安装pcre库. (1)uname -a 确定环境 Linux localhost.localdomain 2.6. ...