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 ...
随机推荐
- 《JavaScript DOM编程艺术》读后总结
这是我读的第一本关于JS的书,刚开始我为了选择合适的学习JS的书,看了网上许多人的意见,基本上都是推荐先读这本书.书的内容挺简单的,确实很适合初学者看,阅读的过程中不会产生什么障碍.内容虽然简单,但我 ...
- Python 批量修改文件名
最近下载了几部美剧(越狱.迷失.权利的游戏......),每集文件名都好长好长..想改短一些,但一个一个改太累了,于是写了个脚本来实现批量修改: 修改前文件名: 修改后文件名: 代码实现: #enco ...
- 缓存,socket乱码等
在服务端默认的编码情况下,JAVA的SOCKET接收需要GBK编码,而C#的接收需要UTF-8编码
- LeetCode 【318. Maximum Product of Word Lengths】
Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...
- Fiddler (HTTP抓包)简介
1.什么是Fiddler? Fiddler是位于客户端和服务器端的HTTP代理,也是目前最常用的http抓包工具之一.它能够记录客户端和服务器之间的所有HTTP请求,可以针对特定的HTTP请求,分析请 ...
- EL表达式有无双引号的区别
最近做项目时发现原来对EL表达式理解太浅,通过一个springMVC项目,加深了对其的理解,下面总结一下,如发现有不对之处,请批评指正: 1.在单独的js文件中,EL表达式无效,如:var type= ...
- Android学习十二:跑马灯程序实现(简单联系)
package org.tonny; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; ...
- 转载: 查看HADOOP中一个文件有多少块组成及所在机器ip
看文件信息 hadoop fsck /user/filename 更详细的 hadoop fsck /user/filename -files -blocks -locations -racks ...
- Oracle定时计划快速使用
Oracle定时计划快速使用 前言: SQL Server中有相关的定时计划,可以直接打开sql server 的任务管理器进行配置,可以方便.快速实现定时执行相应任务.相应的Oracle也有对应的定 ...
- Eclipse 开发 jsp
下载 eclipse EE 注意 是eclipse EE 版本 下载 apache-tomcat-8.0.15 只下载上面二个 从Window -> Preferences -> S ...