ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第20课 管理事务处理

2022-07-12 19:04:16  阅读:154  来源: 互联网

标签:语句 TRANSACTION ROLLBACK 管理 COMMIT 事务处理 SQL 20


第20课 管理事务处理 20.1 事务处理 20.2 控制事务处理 有的 DBMS要求明确标识事务处理块的开始和结束。如在 SQL Server中,标识如下: 输入▼ BEGIN TRANSACTION ... COMMIT TRANSACTION 分析▼ 在这个例子中,BEGIN TRANSACTION 和 COMMIT TRANSACTION 语句之间的 SQL 必须完全执行或者完全不执行。   MariaDB 和 MySQL 中等同的代码为: 输入▼ START TRANSACTION ... Oracle 使用的语法: 输入▼ SET TRANSACTION ... PostgreSQL 使用 ANSI SQL 语法: 输入▼ BEGIN ... 其他 DBMS 采用上述语法的变体。你会发现,多数实现没有明确标识事务处理在何处结束。事务一直存在,直到被中断。通常,COMMITT 用于保存更改,ROLLBACK 用于撤销,详述如下。   20.2.1 使用ROLLBACK SQL 的 ROLLBACK 命令用来回退(撤销)SQL 语句,请看下面的语句: 输入▼ DELETE FROM Orders; ROLLBACK; 分析▼ 在此例子中,执行 DELETE 操作,然后用 ROLLBACK 语句撤销。虽然这不是最有用的例子,但它的确能够说明,在事务处理块中,DELETE 操作(与INSERT 和 UPDATE 操作一样)并不是最终的结果。   20.2.2 使用COMMIT 一般的 SQL 语句都是针对数据库表直接执行和编写的。这就是所谓的隐式提交(implicit commit),即提交(写或保存)操作是自动进行的。 在事务处理块中,提交不会隐式进行。不过,不同 DBMS 的做法有所不同。有的 DBMS 按隐式提交处理事务端,有的则不这样。 进行明确的提交,使用 COMMIT 语句。下面是一个 SQL Server 的例子: 输入▼ BEGIN TRANSACTION DELETE OrderItems WHERE order_num = 12345 DELETE Orders WHERE order_num = 12345 COMMIT TRANSACTION 分析▼ 在这个 SQL Server 例子中,从系统中完全删除订单 12345。因为涉及更新两个数据库表 Orders 和 OrderItems,所以使用事务处理块来保证订单不被部分删除。最后的 COMMIT 语句仅在不出错时写出更改。如果第一条 DELETE 起作用,但第二条失败,则 DELETE 不会提交。   20.2.3 使用保留点 使用简单的 ROLLBACK 和 COMMIT 语句,就可以写入或撤销整个事务。但是,只对简单的事务才能这样做,复杂的事务可能需要部分提交或回退。 例如前面描述的添加订单的过程就是一个事务。如果发生错误,只需要返回到添加 Orders 行之前即可。不需要回退到 Customers 表(如果存在的话)。 要支持回退部分事务,必须在事务处理块中的合适位置放置占位符。这样,如果需要回退,可以回退到某个占位符。 在 SQL 中,这些占位符称为保留点。在 MariaDB、MySQL 和 Oracle 中创建占位符,可使用 SAVEPOINT 语句。 输入▼ SAVEPOINT delete1; 在 SQL Server 中,如下进行: 输入▼ SAVE TRANSACTION delete1; 每个保留点都要取能够标识它的唯一名字,以便在回退时,DBMS 知道回退到何处。要回退到本例给出的保留点,在 SQL Server 中可如下进行。 输入▼ ROLLBACK TRANSACTION delete1; 在 MariaDB、MySQL 和 Oracle 中,如下进行: 输入▼ ROLLBACK TO delete1;   下面是一个完整的 SQL Server 例子: 输入▼ BEGIN TRANSACTION INSERT INTO Customers(cust_id, cust_name) VALUES('1000000010', 'Toys Emporium'); SAVE TRANSACTION StartOrder; INSERT INTO Orders(order_num, order_date, cust_id) VALUES(20100,'2001/12/1','1000000010'); IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder; INSERT INTO OrderItems(order_num, order_item, prod_id, quantity,item_price) VALUES(20100, 1, 'BR01', 100, 5.49); IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder; INSERT INTO OrderItems(order_num, order_item, prod_id, quantity,item_price) VALUES(20100, 2, 'BR03', 100, 10.99); IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder; COMMIT TRANSACTION 分析▼ 这里的事务处理块中包含了 4 条 INSERT 语句。在第一条 INSERT 语句之 后定义了一个保留点,因此,如果后面的任何一个 INSERT 操作失败, 事务处理能够回退到这里。在 SQL Server 中,可检查一个名为@@ERROR 的变量,看操作是否成功。(其他 DBMS 使用不同的函数或变量返回此 信息。)如果@@ERROR 返回一个非 0 的值,表示有错误发生,事务处理回 退到保留点。如果整个事务处理成功,发布 COMMIT 以保留数据。

标签:语句,TRANSACTION,ROLLBACK,管理,COMMIT,事务处理,SQL,20
来源: https://www.cnblogs.com/lqsj2018/p/16471262.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有