ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL-“事务”的基本特性

2021-12-12 20:32:55  阅读:157  来源: 互联网

标签:事务 加锁 隔离 特性 脏读 MySQL 操作 执行


文章目录


这篇主要是对事务的四个基本特性中的“隔离性”做具体的总结。

概念

事务就是把一组操作打包到一起,执行的时候能够保证这一组操作之间是有一定的特性的,避免出现一些安全问题。因此这组操作就是要不就全部成功执行,要不就是全部失败。

事务解决的问题

在某些数据表中,根据业务的需要,要求一些操作是必须要绑定在一起,要不就全部成功,要不就全部失败。比如我们在银行操作转账时,你的账户余额减小和对方的账户余额增加是必须是绑定在一起的。如果中间出现异常就会导致所有的操作恢复原来的样子。

事务的基本特性

原子性

原子性是事务中的最重要特性,需要保证这组操作必须是原子的。若干个操作,要不就全部成功,要不就全部不执行。这里的不执行实际是如果说某个中间环节出错,就会把前面已经执行的步骤“回滚”回去。

一致性

执行事务的前后,必须保证数据始终处于一种合法的状态。这里的合法性指的是,如果某一列的数据取值范围是0-10,执行事务之后,这一列的取值范围还在0-10就是合法的,如果不在这个范围就是不合法的。

持久性

事务一旦执行完毕,数据的修改就是持久生效的,也就是数据写入到了磁盘中。

隔离性

多个事务并发执行时,事务之间是不可以相互干扰的。
但是隔离和并发是两个完全相反的概念,前者是保证数据的准确性,后者是保证效率。因此隔离性就需要保证在满足数据准确的要求下,最大程度去提高并发的程度。

并发执行事务就会产生以下问题
1、脏读

举个简单的例子,老师们马上就要收作业了,你的同桌的作业已经写了一半了,你的作业才刚开始,你想要抄同学作业,但是你在抄的过程中没有注意到同桌修改了前面的作业,但是你已经抄了没有跟着他一起修改,那你抄到的作业就是脏读。

如果一个事务A正在修改数据,另一个事务B在读取这里的数据,事务B的读操作就属于脏读。因为事务A可能在提交之前,修改刚才事务B读取到的数据。

解决的办法:给写的操作加锁,直到写操作完成之后,再允许读。如果在写的过程中尝试读,就会阻塞。也就是你可以和同学约定好他写完一科之后告诉你,你再抄。

2、不可重复读

接着上面的说,上面我们解决了同桌在写的时候,你不能抄的问题,但是你在抄的时候,同桌还是可以修改自己的作业。此时你就会发现刚才抄的作业怎么和同桌的不一样了。这就出现了不可重复读的问题。

一个事务A在执行的过程中,事务B两次读取到的数据是不相同的。

解决的办法:给读操作也加锁。
写加锁指的是修改代码的时候,不可以读。读加锁指的是读操作的时候,也不可以写。

3、幻读

一次事务执行的过程中,多次读取的结果集是不一样的。虽然在读操作加了锁,不可以修改,但是可以新增和删除元素。

解决的办法:串行化

隔离级别

隔离性的要求越高,并发程度就越低,数据就越可靠,效率也就越低
1、read uncommitted:允许读取为提交的数据(会存在脏读的问题)
2、read committed:只允许读取已经提交的数据,写操作加锁(解决了脏读问题,但是存在不可重复读的问题)
3、repeatable(默认的隔离级别):读操作加锁(解决了不可重复读的问题,但是存在幻读的问题)
4、serializable:严格串行化执行(隔离级别最高,并发程度最低,解决幻读问题)

标签:事务,加锁,隔离,特性,脏读,MySQL,操作,执行
来源: https://blog.csdn.net/bygc98/article/details/121892307

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有