| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL之事务 -> 正文阅读 |
|
[大数据]MySQL之事务 |
1 事务1.1 简介事务是一条或者多条语句组成的最小不可分割单元,要么一起成功,要么一起失败。 举例:银行转账,我向你的账户里面转入500块钱,你的账户里面相应就会+500块,而我的账户会-500块,这些操作必须是同时成功的,不会出现我向你转账,但是我的账户的钱没有减少。 1.2 四大特性ACID事务有四大特性:原子性、一致性、隔离性、持久型。 A(atomicity):原子性 ?事务是一个原子操作,要么全部成功,要么全部失败 ACID如何保证呢?原子性:undo log记录回滚日志信息,事务回滚撤销已经执行成功的sql 隔离性:MVCC保证 持久性:redo log 宕机可以从日志中恢复 一致性:由三大特性保证,程序代码要保证业务上的一致性 并发事务存在的问题
? 要怎么解决这些并发事务的问题呢?事务的隔离级别! 1.3 隔离级别MySQL默认隔离级别为可重复读,Oracle和sql server默认是读已提交。
1.4 演示1.4.1 读未提交设置隔离级别,并开启事务:
?可以看出:第一个事务读取到第二个事务未提交的插入数据,读未提交没办法解决脏读,这里不可重复读和幻读也会产生。 1.4.2 读已提交
可以看出:第一个事务两次读取的数据不一样,下面是读已提交解决脏读: 1.4.3 可重复读
?解决不可重复读,但是会出现幻读(当前读情况下),如下:普通的select是快照读,读取的是旧数据。 1.4.4 可串行化可串行化能解决以上的问题,但是效率很低,相当于把事务排队了,所以不会出现问题。 1.5?MySQL如何解决幻读?使用MVCC和next-key。 mvcc与next-key分别在什么情况下起作用? 在快照读的情况下,会通过mvcc来避免幻读
快照读:所有普通的select语句都算快照读,它并不会给表中任何记录做加锁操作,其他事务可以对表中记录做任何改动 当前读:加锁的操作都叫当前读,分为s锁,x锁 共享锁:S锁。在事务要读取一条记录时,需要先获取该记录的S锁 select … lock in share mode 独享锁(排他锁):X锁。事务要改动一条记录时,需要先获取X锁 select … for update、insert、update、delete S锁与S锁是兼容的;S锁与X锁是不兼容;X锁与X锁也是不兼容。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 10:53:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |