MySQL中的事务课件.pptxVIP

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

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(读未提交)隔离级别,以此来减少数据的脏读问题。

当事务的隔离级别设置为R

您可能关注的文档

文档评论(0)

方世玉 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6101050130000123

1亿VIP精品文档

相关文档