数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

SQL实战新手入门:事务(1)


发布日期:2023年02月01日
 
SQL实战新手入门:事务(1)

事务(

事务是SQL提供的一种机制用于强制实施数据库的完整性并保持数据的统一性事务提供了这样一种机制可以确保将多个步骤的操作作为单个执行单元如果事务中涉及的任何一个步骤失败那么整个事务都将回滚如果所有的步骤都已经成功完成那么既可以提交事务(即将所有的修改保存回数据库)也可以回滚事务(即取消所有修改)

尽管保留了SQL标准的灵魂但各个RDBMS厂商在对事务的实现上存在着一定的差异桌面型数据库在嵌入数据库的代码中处理事务(对于Microsoft Access来说是VBA)其他RDBMSOracleIBM DBMicrosoft SQL Server 和PostgreSQL都具有健壮的事务支持MySQL实现了一个独一无二的特性即为表指定存储引擎的功能MySQL的两种存储引擎InnoDB和IBMDBI都提供了对事务的原生支持

什么是事务

事务在更小的粒度上补充了会话的概念它将发生在会话期间的每一个操作划分为逻辑的工作单元通过这样的办法数据库操作那些涉及数据修改的操作将按照步骤一步一步地执行并且可以在任何时刻回滚操作或者在每一个步骤都成功执行的情况下提交这些操作

涉及创建和销毁数据库对象的数据定义语言(DDL)结构的修改并不是事务性的可能无法回滚这取决于RDBMS以及一些附加的参数设置(例如隔离级别这将在本章后面进行讨论)

SQL标准一开始就定义了事务并在后续的标准中增强了这一概念根据SQL标准事务是由RDBMS启动的并一直持续到发出一条COMMIT或ROLLBACK语句细节则由RDBMS自己实现列出了SQL标准定义的事务管理语句

SQL标准定义的事务管理语句

一个工作单元必须满足ACID的条件才能称之为一个事务ACID这个首字母缩略词代表了如下含义

原子性所有修改要么全部接受要么全部取消如果批中的任何一个语句失败则所有修改必须被复原

一致性在事务完成或回滚时操作中涉及的所有数据必须保持一致性状态不能破坏数据库的完整性

隔离性除非将事务提交给数据库否则一个事务不应该知道任何其他事务对数据所做的修改可以设置不同的隔离级别来改变这一默认行为

持久性对于已经成功提交到数据库的事务其结果将保存在数据库中

关于事务一个真实生活的例子就是ATM(银行的自动取款机)的取款操作假设你需要取一笔钱并决定从最近的取款机取钱你只需要将你的银行卡(用户ID)插入取款机并输入你的个人识别码(PIN)就可以开始一个会话过程一旦银行确认了你的身份就允许你继续操作你可以要求提取指定数量的现金这时就会开始一个事务它涉及几个操作取款机必须检查你的账户验证你是否具有足够的钱来完成该事务并从你的账户总额中减去取款金额然后再向你公布账单如果其中任何一个步骤(以及其他一些步骤这取决于指定银行定义的策略)失败则必须取消该事务所有数据都必须恢复到事务开始之前的状态这意味着除非RDBMS已经从你的账户余额中减去了取款额否则你无法取到现金除非你的账户上有足够的余额来完成该事务否则银行将无法从你的账户余额中减去取款额在所有这些操作都成功之后你才能取到现金无论什么原因(例如你取消了操作或者银行取款机发生故障)如果其中任何一个步骤失败则所有的改变都必须回滚到事务之前的状态

在ANSI/ISO的SQL标准中定义了事务的模型它规定事务以隐式方式开始在成功执行了该事务的所有逻辑单元之后使用一个显式的COMMIT或者当需要回滚未提交的变更时使用一个显式的ROLLBACK(例如当程序异常终止时)绝大多数RDBMS都遵循这一事务模型

显式事务和隐式事务

在SQL标准中将隐式事务作为默认的事务行为这种方式过于小心谨慎了无论何时如果在会话期间执行了某些DDL和DML语句RDBMS就会启动(或继续)一个事务通过发出一条COMMIT语句或者一条ROLLBACK语句就可以终止事务

显式事务是由客户端使用BEGIN TRANSACTION语句来启动的并采用与隐式事务类似的办法手动发出命令来终止事务可以为显式事务定义一个名称但这是可选的为事务定义名称有助于更好地维护代码

例如Microsoft SQL Server 提供了SETIMPLICIT_TRANSACTIONS{ON|OFF}语句用于配置事务的默认行为如果该选项为ON当声明了下列语句之一时SQL Server将自动启动一个事务ALTER TABLECREATEDELETEDROPFETCHGRANTINSERTOPENREVOKESELECTTRUNCATETABLE和UPDATE事务必须显式地提交或者显式地回滚一旦执行了前面所列的任何一个语句就会启动一个新事务将IMPLICIT_TRANSACTIONS选项调整为OFF将返回到事务默认的自动提交事务模式

尽管并非SQL标准的要求但在绝大多数RDBMS中在任何DDL语句之前和之后都会隐式地发出一个COMMIT命令

返回目录SQL实战新手入门

编辑推荐

Oracle索引技术

高性能MySQL

数据仓库与数据挖掘培训视频教程

上一篇:SQL实战新手入门:孤立会话

下一篇:SQL实战新手入门:事务(2)