文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL事务隔离实现并发控制的示例分析

2023-06-20 13:02

关注

这篇文章主要介绍了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原则:

2、事务的生命周期

MySQL事务隔离实现并发控制的示例分析

显式事务:明确的规定事务的开始

隐式事务:默认为隐式事务,每执行完一句语句后直接提交

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、事务的隔离级别

MVCC: 多版本并发控制,和事务级别相关

MySQL事务隔离实现并发控制的示例分析

修改事务隔离级别:服务器变量tx_isolation指定,默认为REPEATABLE-READ,可在GLOBAL和SESSION级进行设置

tx_isolation

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事务隔离实现并发控制的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯