事务隔离实现并发控制:MySQL系列之十
一、并发访问控制
实现的并发访问的控制技术是基于锁;
锁分为表级锁和行级锁,MyISAM存储引擎不支持行级锁;InnoDB支持表级锁和行级锁;
锁的分类有读锁和写锁,读锁也被称为共享锁,加读锁的时候其他的人可以读;写锁也称为独占锁或排它锁,一个写锁会阻塞其他读操作和写操作;
锁还分为隐式锁和显式锁,隐式锁由存储引擎自行管理,显式锁是用户手动添加锁;
锁策略:在锁粒度及数据安全性寻求的平衡机制。
显式锁的使用方法:LOCK TABLES tbl_name READ|WRITE
MariaDB [school]> LOCK TABLES students READ; #加读锁
MariaDB [school]> UNLOCK TABLES; #解锁
读锁:任何人都不可写
写锁:自己可以读写,但是其他人不可读写
FLUSH TABLES tb_name :关闭正在打开的表(清除查询缓存),通常在备份前加全局读锁
SELECT clause [FOR UPDATE | LOCK IN SHARE MODE] 查询时加写或读锁
二、事务Transactions
一组原子性的SQL语句,或一个独立工作单元
1、事务遵循ACID原则:
- A:atomicity原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚
- C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性状态
- I:Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔离级别,实现并发
- D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中
2、事务的生命周期

显式事务:明确的规定事务的开始
隐式事务:默认为隐式事务,每执行完一句语句后直接提交
autocommit = {OFF|ON} 开启或关闭自动提交,建议使用显式请求和提交事务,而不要使用“自动提交”功能
启动事务:START TRANSACTION;
插入标签:ROLLBACK TO ##;
撤销回指定标签:ROLLBACK TO ##;
全部撤销:ROLLBACK;
提交事务:COMMIT;
删除标签:RELEASE SAVEPOINT;
MariaDB [school]> START TRANSACTION; #明确指明启动一个事务
MariaDB [school]> INSERT students(StuID,Name,Age,Gender) VALUES (26,'Tom',22,'M'); #添加一条记录
MariaDB [school]> SAVEPOINT sp26; #插入一个标签
MariaDB [school]> INSERT students(StuID,Name,Age,Gender) VALUES (27,'Maria',12,'F'); #再加入一条记录
MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #查看一下,可以看到刚刚插入的数据
+-------+-------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+-------+-----+--------+---------+-----------+
| 26 | Tom | 22 | M | NULL | NULL |
| 27 | Maria | 12 | F | NULL | NULL |
+-------+-------+-----+--------+---------+-----------+
MariaDB [school]> ROLLBACK TO sp26; #撤销到sp26标签之前的状态
MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #查看一下,刚刚maria的信息被撤回了
+-------+------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+------+-----+--------+---------+-----------+
| 26 | Tom | 22 | M | NULL | NULL |
+-------+------+-----+--------+---------+-----------+
MariaDB [school]> COMMIT; #提交事务
MariaDB [school]> SELECT * FROM students WHERE stuid IN (26,27); #最终的数据
+-------+------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+------+-----+--------+---------+-----------+
| 26 | Tom | 22 | M | NULL | NULL |
+-------+------+-----+--------+---------+-----------+
3、事务的隔离级别
- READ UNCOMMITTED 其他事务可以看到未提交的脏数据,产生脏读
- READ COMMITTED 提交后其他事务可以看到修改后的数据,每次读取的数据可能不一致,不可重复读
- REPEATABLE READ 可重复读,每次看到的数据都一致,数据被修改后看不到最新数据,会产生幻读(默认设置)
- SETIALIZABILE 未提交的读事务阻塞修改事务,串行执行,并发性差
MVCC: 多版本并发控制,和事务级别相关

修改事务隔离级别:服务器变量tx_isolation指定,默认为REPEATABLE-READ,可在GLOBAL和SESSION级进行设置
tx_isolation
- Description: The transaction isolation level. See also SET TRANSACTION ISOLATION LEVEL.
- Commandline:
--transaction-isolation=name - Scope: Global, Session
- Dynamic: Yes
- Type: enumeration
- Default Value:
REPEATABLE-READ - Valid Values:
READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ,SERIALIZABLE
MariaDB [school]> SELECT @@tx_isolation; #默认为可重复读级别
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
MariaDB [school]> SET tx_isolation='READ-UNCOMMITTED';
MariaDB [school]> set tx_isolation='READ-COMMITTED';
MariaDB [school]> set tx_isolation='REPEATABLE-READ';
MariaDB [school]> set tx_isolation='SERIALIZABLE';
4、死锁
两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态会发生死锁
在A事务修改t1表的第3行,B事务修改t2表的第2行时;这时A事务去修改t2表的第2行,这时就把A事务阻塞了,然后B事务有刚刚好去修改t1表的第3行,这时B事务也被阻塞了,这时就产生了死锁。
俩个事务同时去更改对方的修改的表,互相阻塞;系统会发现死锁,会自动牺牲一个代价小的事务来解开死锁。
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
查看进程列表:MariaDB [school]> SHOW PROCESSLIST;
杀死进程:MariaDB [school]> KILL 5;
事务隔离实现并发控制:MySQL系列之十的更多相关文章
- MySQL常用配置和性能压力测试:MySQL系列之十五
一.MySQL常用配置 以下所有配置参数以32G内存的服务器为基 1.打开独立的表空间 innodb_file_per_table = 1 2.MySQL服务所允许的同时会话数的上限,默认为151,经 ...
- 备份与恢复:MySQL系列之十二
一.备份策略赘述 1.备份的类型 类型1: 热备份:读写不受影响(MyISAM不支持热备,InnoDB支持热备) 温备份:仅可以执行读操作 冷备份:离线备份,读写操作均中止 类型2: 物理备份:复制数 ...
- MySQL的高可用实现:MySQL系列之十四
MySQL的高可以有三种实现方式:多主模式(Multi Master MySQL),MHA(Master High Availability)和 Galera Cluster:wresp 一.MHA ...
- Mysql系列(十二)—— 索引下推优化
索引条件下推(ICP)是对MySQL使用索引从表中检索行的情况的优化.如果没有ICP,存储引擎会遍历索引以查找基表中的行,并将它们返回给MySQL服务器,该服务器会评估WHERE行的条件.启用ICP后 ...
- Mysql系列(十)—— 性能分析工具profiling
转载自:http://www.ywnds.com/?p=8677 explain是从mysql怎样解析执行sql的角度分析sql优劣.profiling是从sql执行时资源使用情况的角度来分析sql. ...
- 查询mysql事务隔离级别
查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava 1.查看当前会话隔离 ...
- mysql事务之一:MySQL数据库事务隔离级别(Transaction Isolation Level)及锁的实现原理
一.数据库隔离级别 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数 ...
- Mysql事务隔离级别学习
这篇文章主要谈谈Mysql事务隔离级别的区别,以及自己的一些感受. 自己一直以来没搞懂“可重复读”和可提交读“两者之间的区别,通过此次的实践,清楚了两者之间的区别.废话不说,先上图看看这几个事务隔离级 ...
- MySQL Transaction--MySQL与SQL Server在可重复读事务隔离级别上的差异
MySQL和SQL Server两种数据库在REPEATABLE-READ事务隔离级别实现方式不同,导致使用上也存在差异. 在MySQL中,默认使用REPEATABLE-READ事务隔离级别,MySQ ...
随机推荐
- 数据库连接池(connection pool)
1.JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: – 在主程序(如servlet.beans)中建立数据库连接. – 进行sql ...
- Android 中对于图片的内存优化方法
Android 中对于图片的内存优化方法,需要的朋友可以参考一下 1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFact ...
- 错误名称:Uncaught SyntaxError: Unexpected identifier
控制台输出: 1.谷歌:Uncaught SyntaxError: Unexpected identifier 2.火狐:SyntaxError: missing ] after element li ...
- Deferred Shading延迟渲染
Deferred Shading 传统的渲染过程通常为:1)绘制Mesh:2)指定材质:3)处理光照效果:4)输出.传统的过程Mesh越多,光照处理越费时,多光源时就更慢了. 延迟渲染的步骤:1)Pa ...
- 如何使用ODB(How to use odb On windows)
1.下载ODB library:ODB Compiler,Common Runtime Library,Database Runtime Library. http://www.codesynthes ...
- POJ1365:素数
Prime Land Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3552 Accepted: 1609 Descri ...
- Python图片识别——人工智能篇
一.安装pytesseract和PIL PIL全称:Python Imaging Library,python图像处理库,这个库支持多种文件格式,并提供了强大的图像处理和图形处理能力. 由于PIL仅 ...
- 都是stm32的JTAG引脚惹的祸
转载请注明出处:http://blog.csdn.net/qq_26093511/article/category/6094215 最近在调试08接口的LED显示屏,使用的是自己做的STM32板子. ...
- ng2 中使用echart
1.首先创建echarts指令 //echart.directive.ts important { Directive,ElementRef,Input,Ouput,Onchanges,OnInit, ...
- kafka 基础知识梳理(转载)
一.kafka 简介 kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据.这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因 ...