MySQL中的事务课件_第1页
MySQL中的事务课件_第2页
MySQL中的事务课件_第3页
MySQL中的事务课件_第4页
MySQL中的事务课件_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MySQL中的事务事务的隔离级别MySQL作为多线程并发访问的数据库,其明显的特点是资源可以被多个用户共享访问。当多个用户(多个事务)同时访问相同的数据库资源时,如果各事务之间没有采取必要的隔离措施,可能会出现以下几种不确定的情况。一个事务读取了某行数据,而另外一个事务已经更新了此行的数据,但没有及时提交,例如,事务A读取了事务B更新的数据,随后事务B因为某些原因进行了回滚操作,那么事务A读取到的数据就是脏数据。这种情况是非常危险的,很可能造成所有的操作都被回滚。(1)脏读事务的隔离级别

不可重复读是指一个事务的修改和提交造成另一个事务在同一范围内的两次相同查询的返回结果不同。例如,事务A需要多次读取同一个数据,在事务A还没有结束时,事务B访问并修改了该数据,那么,事务A两次读取到的数据就可能不一致,因此称为不可重复读,即原始数据不能重复读。(2)不可重复读事务的隔离级别

幻读是指一个线程中的事务读取到了另外一个线程中提交的INSERT数据。例如,用户A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是用户B此时插入了一条具体分数的记录,用户A修改完成后发现还有一条记录没有改过来,就好像发生了幻觉一样,因此称这种情况为幻读或者虚读。(3)幻读事务的隔离级别为了避免上述3种情况的发生,MySQL中为事务定义了不同的隔离级别,以此来保证数据的稳定性。事务的隔离级别由低到高可分为ReadUncommitted、ReadCommitted、RepeatableRead、Serializable,如表所示:事务的隔离级别事务的隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也会相应增大。另外,不同的隔离级别可能会造成不同的并发异常,如表所示:事务的隔离级别在MySQL中,可以使用相关语句查看当前会话的隔离级别,具体如下所示:同样,用户也可以使用SET

语句设置当前会话的隔离级别,具体的语法格式如下所示:以上语法格式中,SESSION代表设置的是当前会话的隔离级别,LEVEL后跟随着4个可选参数,分别对应4个隔离级别。接下来将通过具体案例分别演示4个隔离级别可能引起的并发问题。

当事务的隔离级别为ReadUncommitted(读未提交)时,可能出现数据的脏读问题,即一个事务读取了另一个事务未提交的数据。在演示过程中将打开两个客户端会话窗口,以此来模仿不同的事务操作同一数据的场景,叙述中将这两个客户端分别简称为客户端A和客户端B。

另外,上文中已经提到,MySQL默认的隔离级别为RepeatableRead(可重复读),这里对A、

B客户端默认的隔离级别也未作修改。接下来将通过不断改变客户端A的隔离级别,同时在客户端B修改数据,来演示各个隔离级别出现的问题。1.脏读问题事务的隔离级别事务的隔离级别首先,将客户端A的隔离级别设置为ReadUncommitted(读未提交),SQL语句如下所示:以上执行结果证明客户端A的隔离级别设置为了ReadUncommitted(读未提交)。在客户端A中查询account表的数据,SQL语句如下所示:事务的隔离级别然后在客户端B中进行事务操作。在开启事务后,执行账户A转账给账户C100元的数据操作,但不进行事务的提交,SQL语句如下所示:事务的隔离级别以上执行结果证明账户A成功转账给账户C100元。此时通过客户端A查看account表中的数据,SQL语句如下所示。

从以上执行结果可看出,在客户端A中查询account表中的数据,发现账户A已经给账户C转账了100元,但此时客户端B中的事务还没有提交,客户端A读取到了客户端B还未提交事务修改的数据,即脏数据。这种情况很容易造成数据的混乱,使数据的一致性遭到破坏。事务的隔离级别此时,在客户端B对事务进行回滚操作,具体的SQL语句如下所示:

从以上执行结果可以看出,客户端B成功进行了事务回滚。此时通过客户端A再次查询account表中的数据,SQL语句如下所示:从代码的执行结果可以看出,客户端A查询到了客户端B事务回滚后的数据。在实际应用中应该根据实际情况合理地使用ReadUncommitted(读未提交)隔离级别,以此来减少数据的脏读问题。当事务的隔离级别设置为ReadCommitted(读已提交)时,一个事务在对数据进行查询的过程中可能会遇到其他事务对数据进行修改的情况,从而导致事务中的两次查询结果不一致,即出现数据的不可重复读问题。下面将对这种情况进行详细的演示。2.不可重复读问题事务的隔离级别事务的隔离级别首先,将客户端A的隔离级别设置为ReadCommitted(读已提交),SQL语句如下所示:从上方代码的执行结果可以看出,客户端A的隔离级别设置为了ReadCommitted(读已提交)。这时在客户端A中开启一个查询account表数据的事务,SQL语句如下所示:事务的隔离级别然后在客户端B中进行事务操作。开启事务后,进行账户A转账给账户C100元的数据操作并提交事务,SQL语句如下所示:事务的隔离级别从以上执行结果可看出,客户端B中的事务操作完成,账户A给账户C转账了100元,此时在未提交事务的客户端A中再次查询account表中的数据信息,SQL语句如下所示:从以上代码的执行结果可看出,从客户端A中查询出了客户端B修改后的数据,也就是说客户端A在同一个事务中分别在不同时间段查询同一个表的结果不一致,即数据的不可重复读问题。幻读问题的出现与不可重复读问题的出现原因类似,当事务的隔离级别为RepeatableRead(可重复读)时,一个事务在查询过程中,其他事务可能会对数据继续更新操作,从而导致两次查询的数据条数不一致。下面将针对事务中出现幻读的情况进行详细的演示和说明。3.幻读问题事务的隔离级别事务的隔离级别首先,将客户端A的隔离级别设置为RepeatableRead(可重复读),SQL语句如下所示:事务的隔离级别从上方代码的执行结果可以看出,客户端A的隔离级别成功设置为了RepeatableRead(可重复读)。接下来,在客户端A中开启一个查询account表数据的事务,SQL语句如下所示:事务的隔离级别然后在客户端B中进行更新操作,添加一个余额为500元的账户D,SQL语句如下所示:从以上执行结果可看出,客户端B中的数据添加操作执行成功,此时在未提交事务的客户端A中查询account表中的数据,SQL语句如下所示:从执行结果可以看出,在客户端A中查询account表的数据并没有出现幻读的问题,这与之前预期的结果并不相同。出现这种情况的主要原因是MySQL的存储引擎通过多版本并发控制(MultiVersionConcurrencyControl,MVCC)机制解决了数据幻读的问题。因此,当MySQL的隔离级别为RepeatableRead(可重复读)时,是可以避免幻读问题的出现的。事务的隔离级别

Serializable(可串行化)为最高的事务隔离级别,该级别会在每一行读取的数据上都加锁,从而使各事务之间不会出现相互冲突,但这种方式会导致系统资源占用过多,出现大量的超时现象。下面将对这种隔离级别进行演示和说明。4.可串行化事务的隔离级别事务的隔离级别首先,将客户端A的隔离级别设置为Serializable(可串行化),SQL语句如下所示:然后在客户端A中开启一个查询account表数据的事务,具体的SQL语句如下所示:事务的隔离级别接着在客户端B中进行更新操作,添加一个余额为800元的账户E,SQL语句如下所示:从执行结果可以看出操作超时,导致数据添加失败。造成这种现象的原因是此时客户端A的事务隔离级别为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论