在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、并发访问控制实现的并发访问的控制技术是基于锁; 锁分为表级锁和行级锁,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原则:
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、事务的隔离级别
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事务也被阻塞了,这时就产生了死锁。 俩个事务同时去更改对方的修改的表,互相阻塞;系统会发现死锁,会自动牺牲一个代价小的事务来解开死锁。
查看进程列表: 杀死进程: 到此这篇关于MySQL系列之十 MySQL事务隔离实现并发控制的文章就介绍到这了,更多相关mysql并发控制内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! 到此这篇关于MySQL系列之十 MySQL事务隔离实现并发控制的文章就介绍到这了,更多相关mysql并发控制内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论