热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

MySQL心得10-1--事务_MySQL

MySQL心得10-1--事务
bitsCN.com MySQL心得10-1--事务 1. 在MySQL环境中,事务由作为一个单独单元的一个或多个SQL语句组成。这个单元中的每个SQL语句是互相依赖的,而且单元作为一个整体是不可分割的。如果单元中的一个语句不能完成,整个单元就会回滚(撤销),所有影响到的数据将返回到事务开始以前的状态。因而,只有事务中的所有语句都成功地执行才能说这个事务被成功地执行。 2.并不是所有的存储引擎都支持事务,如InnoDB和BDB支持,但MyISAM和MEMORY不支持。 通过InnoDB和BDB表类型,MySQL 事务系统能够完全满足事务安全的ACID测试。旧的表类型,如MyISAM类型,不支持事务。因此,这种系统中的事务只能通过直接的表锁定实现。 术语“ACID”是一个简称,每个事务的处理必须满足ACID原则,即原子性:A(atom)、一致性:C(consistent)、隔离性:I(independence)、持久性:D(durability)。 (1)原子性 原子性意味着每个事务都必须被认为是一个不可分割的单元。假设一个事务由两个或者多个任务组成,其中的语句必须同时成功才能认为事务是成功的。如果事务失败,系统将会返回到事务以前的状态。 在添加雇员这个例子中,原子性指如果没有创建雇员相应的工资表和部门记录,就不可能向雇员数据库添加雇员。 原子的执行是一个或者全部发生或者什么也没有发生的命题。在一个原子操作中,如果事务中的任何一个语句失败,前面执行的语句都将返回,以保证数据的整体性没有受到影响。这在一些关键系统中尤其重要,现实世界的应用程序(如金融系统:转账)执行数据输入或更新,必须保证不出现数据丢失或数据错误,以保证数据安全性。 (2)一致性 不管事务是完全成功完成还是中途失败,当事务使系统处于一致的状态时存在一致性。参照前面的例子,一致性是指如果从系统中删除了一个雇员,则所有和该雇员相关的数据,包括工资数据和组的成员资格也要被删除。 在MySQL中,一致性主要由MySQL的日志机制处理,它记录了数据库的所有变化,为事务恢复提供了跟踪记录。如果系统在事务处理中间发生错误,MySQL恢复过程将使用这些日志来发现事务是否已经完全成功地执行,是否需要返回。因而一致性属性保证了数据库从不返回一个未处理完的事务。 (3)隔离性 隔离性是指每个事务在它自己的空间发生,和其他发生在系统中的事务隔离,而且事务的结果只有在它完全被执行时才能看到。即使在这样的一个系统中同时发生了多个事务,隔离性原则保证某个特定事务在完全完成之前,其结果是看不见的。 当系统支持多个同时存在的用户和连接时(如MySQL),这就尤其重要。如果系统不遵循这个基本规则,就可能导致大量数据的破坏,如每个事务的各自空间的完整性很快地被其他冲突事务所侵犯。 获得绝对隔离性的唯一方法是保证在任意时刻只能有一个用户访问数据库。当处理像MySQL这样多用户的RDBMS时,这不是一个实际的解决方法。但是,大多数事务系统使用页级锁定或行级锁定隔离不同事务之间的变化,这是要以降低性能为代价的。例如,MySQL的BDB表处理程序使用页级锁定来保证处理多个同时发生的事务的安全,InnoDB表处理程序使用更好的行级锁定。 (4)持久性 持久性是指即使系统崩溃,一个提交的事务仍然存在。当一个事务完成,数据库的日志已经被更新时,持久性就开始发生作用。大多数RDBMS产品通过保存所有行为的日志来保证数据的持久性,这些行为是指在数据库中以任何方法更改数据。数据库日志记录了所有对于表的更新、查询、报表等。 如果系统崩溃或者数据存储介质被破坏,通过使用日志,系统能够恢复在重启前进行的最后一次成功的更新,反映了在崩溃时处于过程的事务的变化。 MySQL通过保存一条记录事务过程中系统变化的二进制事务日志文件来实现持久性。如果遇到硬件破坏或者突然的系统关机,在系统重启时,通过使用最后的备份和日志就可以很容易地恢复丢失的数据。 默认情况下,InnDB表是100%持久的(所有在崩溃前系统所进行的事务在恢复过程中都可以可靠地恢复)。MyISAM表提供部分持久性,所有在最后一个FLUSH TABLES命令前进行的变化都能保证被存盘。 3.事务是由一组SQL语句构成的,它由一个用户输入,并以修改成持久的或者滚到原来状态而终结。 在MySQL中,当一个会话开始时,系统变量AUTOCOMMIT值为1,即自动提交功能是打开的,当用户每执行一条SQL语句后,该语句对数据库的修改就立即被提交成为持久性修改保存到磁盘上,一个事务也就结束了。因此,用户必须关闭自动提交,事务才能由多条SQL语句组成,使用语句:SET@@AUTOCOMMIT=0;执行此语句后,必须明确地指示每个事务的终止,事务中的SQL语句对数据库所做的修改才能成为持久化修改。例如,执行如下语句: DELETE FROM XS WHERE 学号='081101'; SELECT * FROM XS; 从执行结果中发现,表中已经删去了一行。但是,这个修改并没有持久化,因为自动提交已经关闭了。用户可以通过ROLLBACK撤销这一修改,或者使用COMMIT语句持久化这一修改。 4. 具体介绍如何处理一个事务。 1). 开始事务 当一个应用程序的第一条SQL语句或者在COMMIT或ROLLBACK语句(后面介绍)后的第一条SQL执行后,一个新的事务也就开始了。另外还可以使用一条start transaction语句来显示地启动一个事务。 语法格式: START TRANSACTION | BEGINWORK 一条BEGIN WORK语句可以用来替代STARTTRANSACTION语句,但是START TRANSACTION更常用些。 2). 结束事务 COMMIT语句是提交语句,它使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,也标志一个事务的结束,其语法格式为: COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 说明:可选的and chain子句会在当前事务结束时,立刻启动一个新事务,并且新事务与刚结束的事务有相同的隔离等级。Release子句在终止了当前事务后,会让服务器断开与当前客户端的连接。包含NO关键词可以抑制CHAIN或RELEASE完成。 注意:MySQL使用的是平面事务模型,因此嵌套的事务是不允许的。在第一个事务里使用START TRANSACTION命令后,当第二个事务开始时,自动地提交第一个事务。同样,下面的这些MySQL语句运行时都会隐式地执行一个COMMIT命令: ● DROP DATABASE / DROP TABLE ● CREATE INDEX / DROP INDEX ● ALTER TABLE / RENAME TABLE ● LOCK TABLES / UNLOCK TABLES ● SET AUTOCOMMIT=1 3). 撤消事务 Rollback语句是撤销语句,它撤销事务所做的修改,并结束当前这个事务。 语法格式: ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 在前面的举例中,若在最后加上以下这条语句: ROLLBACKWORK; 执行完这条语句后,前面的删除动作将被撤销,可以使用SELECT语句查看该行数据是否还原。 4). 回滚事务 除了撤销整个事务,用户还可以使用ROLLBACK TO语句使事务回滚到某个点,在这之前需要使用savepoint语句来设置一个保存点。 SAVEPOINT语法格式为: SAVEPOINTidentifier(保存点的名称)。 ROLLBACK TO SAVEPOINT语句会向已命名的保存点回滚一个事务。如果在保存点被设置后,当前事务对数据进行了更改,则这些更改会在回滚中被撤销。语法格式为: ROLLBACK [WORK] TO SAVEPOINT identifier 当事务回滚到某个保存点后,在该保存点之后设置的保存点将被删除。RELEASESAVEPOINT语句会从当前事务的一组保存点中删除已命名的保存点。不出现提交或回滚。如果保存点不存在,会出现错误。语法格式为: RELEASE SAVEPOINT identifier 5. 举例说明:下面几个语句说明了有关事务的处理过程: 1. START TRANSACTION 2. UPDATE … 3. DELETE… 4. SAVEPOINT S1; 5. DELETE… 6. ROLLBACK WORK TO SAVEPOINT S1; 7. INSERT… 8. COMMIT WORK; 说明:在以上语句中,第1行语句开始了一个事务;第2、3行语句对数据进行了修改,但没有提交;第4行设置了一个保存点;第5行删除了数据,但没有提交;第6行将事务回滚到保存点S1,这时第5行所做修改被撤销了;第7行修改了数据;第8行结束了这个事务,这时第2、3、7行对数据库做的修改被持久化。 6.每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互的程度。前面曾提到,事务型RDBMS的一个最重要的属性就是它可以“隔离”在服务器上正在处理的不同的会话。在单用户的环境中,这个属性无关紧要:因为在任意时刻只有一个会话处于活动 状态。但是在多用户环境中,许多RDBMS会话在任一给定时刻都是活动的。在这种情况下,RDBMS能够隔离事务是很重要的,这样它们不互相影响,同时保证数据库性能不受到影响。 为了了解隔离的重要性,有必要花些时间来考虑如果不强加隔离会发生什么。如果没有事务的隔离性,不同的SELECT语句将会在同一个事务的环境中检索到不同的结果,因为在这期间,基本上数据已经被其他事务所修改。这将导致不一致性,同时很难相信结果集,从而不能利用查询结果作为计算的基础。因而隔离性强制对事务进行某种程度的隔离,保证应用程序在事务中看到一致的数据。 基于ANSI/ISO SQL规范,MySQL提供了下面4种隔离级:序列化(serialization)、可重复读(repeatable read)、提交读(read committed)、未提交读(read uncommitted)。 7. 只有支持事务的存储引擎才可以定义一个隔离级。定义隔离级可以使用SET TRANSACTION语句。语法格式: SET [GLOBAL | SESSION] TRANSACTION Isolationlevel SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED 说明: 如果指定GLOBAL,那么定义的隔离级将适用于所有的SQL用户;如果指定SESSION,则隔离级只适用于当前运行的会话和连接。MySQL默认为REPEATABLE READ隔离级。 (1)序列化 如果隔离级为序列化,用户之间通过一个接一个顺序地执行当前的事务提供了事务之间最大限度的隔离。 (2)可重复读 在这一级上,事务不会被看成是一个序列。不过,当前在执行事务的变化仍然不能看到,也就是说,如果用户在同一个事务中执行同条SELECT语句数次,结果总是相同的。 (3)提交读 READ COMMITTED隔离级的安全性比REPEATABLE READ隔离级的安全性要差。不仅处于这一级的事务可以看到其他事务添加的新记录,而且其他事务对现存记录做出的修改一旦被提交,也可以看到。也就是说,这意味着在事务处理期间,如果其他事务修改了相应的表,那么同一个事务的多个SELECT语句可能返回不同的结果。 (4)未提交读 提供了事务之间最小限度的隔离。除了容易产生虚幻的读操作和不能重复的读操作外,处于这个隔离级的事务可以读到其他事务还没有提交的数据,如果这个事务使用其他事务不提交的变化作为计算的基础,然后那些未提交的变化被它们的父事务撤销,这就导致了大量的数据变化。 默认情况下,这个系统变量的值是基于每个会话设置的,但是可以通过向SET命令行添加GLOBAL关键字修改该全局系统变量的值。 当用户从无保护的READUNCOMMITTED隔离级转移到更安全的SERIALIZABLE级时,RDBMS的性能也要受到影响。原因很简单:用户要求系统提供越强的数据完整性,它就越需要做更多的工作,运行的速度也就越慢。因此,需要在RDBMS的隔离性需求和性能之间协调。 MySQL默认为REPEATABLE READ隔离级,这个隔离级适用于大多数应用程序,只有在应用程序有具体的对于更高或更低隔离级的要求时才需要改动。没有一个标准公式来决定哪个隔离级适用于应用程序——大多数情况下,这是一个主观的决定,它是基于应用程序的容错能力和应用程序开发者对于潜在数据错误的影响的判断。隔离级的选择对于每个应用程序也是没有标准的。例如,同一个应用程序的不同事务基于执行的任务需要不同的隔离级。
作者 tianyazaiheruan bitsCN.com
推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
author-avatar
zc43pml
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有