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 ...
随机推荐
- linux 添加基于weblogic的nodemanager的服务
用nodemanager来添加weblogic服务启动. 1.新建一个server,命名为Server1,端口设置为7055,其他采用默认值. 2.新建一个Machine,命名为Machine1.配置 ...
- Python图片处理
Python图像处理库PIL基本使用 #将图片转换为灰度图像 from PIL import Image pil_im = Image.open('cat.jpg') gray_cat = pil_i ...
- 王爽< 汇编语言>实验十二
;此乃安装程序 ;功能:将8086cpu中断类型码为0 的中断向量设置为我们编写的中断服务程序入口地址 ;该中断在除法发送溢出的时候产生 assume cs:code code segment mai ...
- 在Visual Studio中设置多核并行编译
VS是一款非常强大实用的IDE,是在Windows环境下学习编程的首选软件. 有些时候大一点的工程项目编译要耗时挺长时间,随便修改一下代码就可能要编译将近一分钟,甚至更多.即便在开启的增量编译的情况下 ...
- LINQ 联查多表数据并封装到ViewModel的实现
LINQ 联查多表数据并封装到ViewModel的实现 public List<MyTask> GetPagedTaskList(int pageIndex, int pageSize, ...
- Spring源码学习之: 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二 ...
- python之购物车的编写(熬夜撸代码中。。。)
购物车的编写对于我这种不是很精通函数的小白来说,简直太难了.各种坑,各种无奈啊!不过总算也是写出来了! 不多说,直接上代码! #!/usr/bin/env python#用户名 sanjiang#密码 ...
- AT Tool --- android手机发送at指令
之前网上也有一款类似的软件,估计是华为内部人员开发的,不过很变态,不但只支持华为的几款手机,而且只能发一条AT命令,然后就不让你发了:所以很气愤,今天花了一天时间自己写了这么款程序,而且是支持所有An ...
- jquery之css操作
HTML示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 回调函数透彻理解Java
http://blog.csdn.net/allen_zhao_2012/article/details/8056665 回调函数透彻理解Java 标签: classjavastringinterfa ...