目录
- 一、并发访问控制
- 二、事务Transactions
- 1、事务遵照ACID原则:
- 2、事务的生命周期
- 3、事务的隔离级别
- 4、死锁
一、并发访问控制
实现的并发访问的控制技能是基于锁;
锁分为表级锁和行级锁,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} 开启或关闭自动提交,建议利用显式请求和提交事务,而不要利用“自动提交”功能
启动事务:复制代码 插入标签:复制代码 撤销回指定标签:复制代码 全部撤销:复制代码 提交事务:复制代码 删除标签:复制代码
- 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级进行设置复制代码
- 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系列之十 MySQL事务隔离实现并发控制的文章就先容到这了,更多相干mysql并发控制内容请搜索脚本之家以前的文章或继承浏览下面的相干文章盼望各人以后多多支持脚本之家! |