MySQL数据库设计与应用项目化教程(微课版) 课件 项目7 掌握数据库的并发控制_第1页
MySQL数据库设计与应用项目化教程(微课版) 课件 项目7 掌握数据库的并发控制_第2页
MySQL数据库设计与应用项目化教程(微课版) 课件 项目7 掌握数据库的并发控制_第3页
MySQL数据库设计与应用项目化教程(微课版) 课件 项目7 掌握数据库的并发控制_第4页
MySQL数据库设计与应用项目化教程(微课版) 课件 项目7 掌握数据库的并发控制_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

项目7掌握数据库的并发控制

掌握数据库的并发控制7.1认识事务7.2事务的并发控制

7.1认识事务1

事务的概念在现实生活中,人们经常会进行转账操作,转账可以分为转入和转出两个部分,只有这两个部分都完成才表示转账成功。这个过程是使用两条SQL语句来完成的。#A账户减少100元mysql>UPDATEaccountSETmoney=money-100WHEREname='A';#B账户增加100元mysql>UPDATEaccountSETmoney=money+100WHEREname='B';如果其中任意一条语句出现异常没有执行,则会导致两个账户的金额不同步,造成错误。7.1认识事务为了防止这种情况发生,就需要使用MySQL中的事务(Transaction)。事务是针对数据库的一组操作,它可以由一条或多条SQL语句组成。在默认情况下,用户执行的每一条SQL语句都会被当成单独的事务自动提交。如果要将一组SQL语句作为一个事务,则需要先执行以下语句显式地开启一个事务。STARTTRANSACTION;7.1认识事务原子性:每个事务都必须被看作一个不可分割的单元。一致性:在事务处理时,要保证数据库系统处于一致的状态。隔离性:当一个事务在执行时,不能被其他事务干扰。持久性:一个事务一旦提交,它对数据库所做的修改将是持久的。事务(Transaction):在MySQL环境中,事务由一个作为逻辑单元的一个或多个SQL语句组成。在实际的工作中,一个事务往往是需要多条语句共同组成,来完成复杂的数据操作。事务的四个特性:原子性(Atomicity)1

事务概述事务中如果有任何一个操作执行失败,已经执行成功的操作也必须撤销,数据库的状态退回到执行事务前的状态。每个事务必须都必须看作一个不可分割的单元,只有事务中的所有数据库操作都执行成功,才算整个事务执行成功。7.1认识事务一致性(Consistency)1

事务概述一致性是指在事务处理时,无论执行成功还是失败,都要保证数据库系统处于一致状态,即数据库从一个一致状态变到另一个一致状态。当数据库只包含成功事务提交的结果时,就说数据库处于一致状态。例如银行的转账操作,全做或全不做,数据库都处于一致状态。7.1认识事务隔离性(Isolation)1

事务概述该机制是通过对事务的数据访问对象加适当的锁,排斥其他事务对同一数据库对象的并发操作来实现的。隔离性是指当一个事务在执行时,不能被其他事务干扰,即一个事务内部的操作及使用的数据,对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。7.1认识事务持久性(Durability)1

事务概述大多数DBMS产品通过保存所有行为的日志来保证数据的永久性,这些行为是指在数据库中以任何方法更改数据。数据库日志记录了所有对于表的更新、查询、报表等行为。持久性是指事务一旦提交,一个事务一旦提交,它对数据库所做的修改将是持久的。接下来的其他操作或故障不应该对其有任何影响。7.1认识事务7.1认识事务2

事务的基本操作1.开始事务STARTTRANSACTION2.提交事务COMMIT;3.回滚事务ROLLBACK;4.事务的保存点SAVEPOINT保存点名;ROLLBACKTOSAVEPOINT保存点名;RELEASESAVEPOINT保存点名;7.1认识事务2

事务的基本操作MySQL默认是自动提交模式。如果没有显式开启事务(STARTTRANSACTION),每一条SQL语句都会自动提交(COMMIT)。5.事务的自动提交mysql>SELECT@@autocommit;+--------------+|@@autocommit|+--------------+|1|+--------------+1rowinset(0.00sec)查看事务是否自动提交:1:开启自动提交0:关闭自动提交7.1认识事务2

事务的基本操作5.事务的自动提交关闭自动提交:关闭后:用户需要手动执行提交(COMMIT)操作。若直接终止MySQL会话,MySQL会自动进行回滚。SETAUTOCOMMIT=0;

掌握数据库的并发控制7.1认识事务7.2事务的并发控制

7.2事务的并发操作1

事务并发操作引起的问题1.丢失修改

(LostUpdate)2.读“脏”数据(DirtyRead)3.

不可重复读(Non-repeatableRead)4.

死锁(Deadlock)T1T2R(A)=30R(A)=30AA-1A=29AA-1A=297.2事务的并发操作1

并发操作引起的问题1.丢失修改

(LostUpdate)7.2事务的并发操作1

并发操作引起的问题T1T2R(C)=100CC*2W(C)=200R(C)=200ROLLBACKC恢复为1002.读“脏”数据(DirtyRead)7.2事务的并发操作1

并发操作引起的问题T1T2R(A)=30R(A)=30AA*2W(A)=60R(A)=603.

不可重复读(Non-repeatableRead)7.2事务的并发操作1

并发操作引起的问题T1STARTTRANSACTION;SELECT*FROMtable1WHEREid=1FORUPDATE;--锁定table1SELECT*FROMtable2WHEREid=1FORUPDATE;--锁定table2COMMIT;T2STARTTRANSACTION;SELECT*FROMtable2WHEREid=1FORUPDATE;--锁定table2SELECT*FROMtable1WHEREid=1FORUPDATE;--锁定table1COMMIT;如果这两个事务几乎同时执行,它们可能会因为互相等待对方持有的锁而发生死锁4.

死锁(Deadlock)7.2事务的并发操作2

事务的隔离级别1.readuncommitted

在该级别下的事务可以读取到其他事务中未提交的数据,即脏读(DirtyRead)。

2.readcommitted在该隔离级别下只能读取其他事务已经提交的数据,虽避免了脏读现象,但会出现不可重复读(Non-repeatableRead)的问题。3.repeatableread是MySQL默认的事务隔离级别,它解决了脏读和不可重复读的问题,也解决了幻读的问题。4.serializable最高的隔离级别,它在每条数据行上加锁,使之不会发生冲突,从而解决了脏读、不可重读和幻读的问题,但是性能最低。7.2.3MySQL的锁机制1

锁机制中的基本概念(1)锁的粒度。锁的粒度是指锁的作用范围。锁的粒度可以分为服务器级锁和存储引擎级锁。MyISAM存储引擎支持表级锁,InnoDB存储引擎支持表级锁和行级锁。

(2)隐式锁与显式锁。MySQL锁分为隐式锁和显式锁。MySQL自动加锁称为隐式锁,数据库开发人员手动加锁称为显式锁。

(3)锁的类型。锁的类型包括读锁(readlock)和写锁(writelock),其中,读锁也称为共享锁,写锁也称为排他锁或者独占锁。读锁允许其他MySQL端对数据同时“读”,但不允许其他MySQL客户端对数据“写”。写锁不允许其他MySQL客户端对数据同时“读”,也不允许其他客户端对数据同时“写”。

7.2.3MySQL的锁机制1

锁机制中的基本概念(4)锁的钥匙。多个MySQL客户端并发访问同一个数据时,如果MySQL客户端A对该数据成功施加了锁,那么只有客户端A拥有这把锁的“钥匙”,也就是说,只有客户端A能够对该锁进行解锁操作。

(5)锁的生命周期。锁的生命周期是指在同一个MySQL服务器连接内,对数据加锁到解锁之间的时间间隔。7.2.3MySQL的锁机制2

锁的分类1.表级锁粒度最大,它实现简单,资源消耗少,就是整个表被锁定,分为读锁和写锁。①

读锁:如果表没有加写锁,那么就加一个读锁;否则,将请求放到读锁队列中。

写锁:如果表没有加任何锁,那么就加一个写锁;否则,将请求放到写锁队列中。7.2.3MySQL的锁机制2

锁的分类2.行级锁

只有线程使用的行是被锁定的,表中的其他行对于其他线程都是可用的。InnoDB表的锁定机制就是行级锁。①

排他锁(eXclusiveLocks):又称为X锁。如果事务T1获得了数据行D上的排他锁,则T1对数据行既可读又可写。事务T1对数据行D加上排他锁,则其他事务对数据行D的任务封锁请求都不会成功,直至事务T1释放数据行D上的排他锁。

共享锁(ShareLocks):又称为S锁。如果事务T1获得了数据行D上的共享锁,则T1对数据项D可以读但不可以写。事务T1对数据行D加上共享锁,则其他事务对数据行D的排他锁请求不会成功,而对数据行D的共享锁请求会成功。7.2.3MySQL的锁机制2

锁的分类3.页级锁定页级锁定将锁定表中的某些行(称作页)。被锁定的行只对锁定最初的线程是可行的。如果另外一个线程想要向这些行写数据,必须等到锁被释放。7.2.3MySQL的锁机制3

死锁的管理两个或两个以上的事务分别申请锁定对方已经锁定的数据对象,导致长期等待而无法继续运行下去的现象称为死锁。死锁的原因1.两个事务分别锁定了两个单独的对象,这时每一个事务都要求在另外一个事务锁定的对象上获得一个锁,结果是每一个事务都必须等待另一个事务释放占有的锁,此时就发生了死锁。这种死锁是最典型的死锁形式。2.在一个数据库中,有若干长时间运行的事务并行的执行操作,查询分析器处理非常复杂的查询时,例如连接查询,由于不能控制处理的顺序,有可能发生死锁。MySQL的InnoDB存储引擎会自动检测死锁循环,并选择一个会话作为死锁中放弃的一方,通过终止该事务来打断死锁。被终止的事务发生回滚,并返回给连接一个错误消息。7.2.3MySQL的锁机制3

死锁的管理事务与锁机制注意事项在处理数据库并发操作时,为避免死锁,需注意以下几点。①锁的粒度越小,应用系统的并发性能就越高,由于InnoDB存储引擎支持行锁,建议使用InnoDB存储引擎表以提高系统的可靠性。②使用事务时,尽量避免一个事务中使用不同存储引擎的表。③处理事务时尽量设置和使用较低的隔离级别。④尽量使用基于行锁控制的隔离级别。必要时使用表锁,可以避免死锁现象。⑤对于InnoDB存储引擎支持的行锁,设置合理的超时参数范围,编写锁等待超时异常处理程序,可以解

温馨提示

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

评论

0/150

提交评论