YashanDB事务由一条或多条SQL语句(DML或DDL)以及一条特殊的SET TRANSACTION语句组成。
事务可以分为如下两类:
以从账户A给账户B转账100元的操作为例,该操作包含以下步骤:
正常情况下,这3个步骤都正常完成,事务提交,全部修改生效。
若操作过程中发生了故障,例如余额不足、账户冻结、营业厅断电等情况,事务将无法完整完成,则必须全部回滚。回滚后,所有的账户余额维持原状。
该操作对应的事务示例如下:
sql 代码解读复制代码INSERT INTO ACCOUNTS VALUES(10, 500);
UPDATE ACCOUNTS SET MONEY = MONEY - 100 WHERE ID = 'A';
UPDATE ACCOUNTS SET MONEY = MONEY + 100 WHERE ID = 'B';
INSERT INTO transaction_log (from_account, to_account, amount, transaction_time)
VALUES ('A', 'B', 100, NOW());
COMMIT;
Copied!
事务启动后直至结束,期间事务始终处于活跃状态。
活跃状态的事务可以接受新的修改,但需提交后才真正生效。在事务活跃期间,以下内容会产生缓存更改:
查询事务活跃状态的示例如下:
sql 代码解读复制代码INSERT INTO TABLE_TEST VALUES(1);
SELECT xid, status FROM V$TRANSACTION;
XID STATUS
4371578888 OPEN
Copied!
YashanDB事务是隐式启动的,由第一条可执行的SQL语句触发启动。
事务启动时,YashanDB会为其分配运行期间所需的资源,包括事务运行需要的内存、锁区、UNDO等,同时会为其分配一个全局唯一的事务ID。
事务启动后,可以通过V$TRASACTION视图查到事务相关信息。
YashanDB事务可以通过手动和自动方式来结束,通常包含以下方式:
sql 代码解读复制代码INSERT INTO TABLE_TEST(1,2,3);
COMMIT;
Copied!
如上述示例,提交一个事务后,(1,2,3)这条数据将持久化至该表内,事务修改生效。
事务控制语句可用于管理事务的行为,包括以下语句:
以下是事务控制语句的使用示例:
编号 | 语句 | 说明 |
---|---|---|
0 | UPDATE MONEY SET SALARY=SALARY-100 WHERE ACCOUNT = A | 此语句执行一个DML,并触发事务启动,将账户A的余额减少100。 |
1 | UPDATE MONEY SET SALARY=SALARY+100 WHERE ACCOUNT = B | 此语句执行一个DML,并触发事务启动,将账户B的余额增加100。 |
2 | SAVEPOINT TRANSFER_MONRY | 创建一个保存点TRANSFER_MONRY |
3 | DELETE MONEY WHERE ACCOUNT = A | 在余额表内删除账户A的记录,进行销户。 |
4 | ROLLBACK TO TRANSFER_MONRY | 将事务回滚至保存点TRANSFER_MONRY,上一条销户操作被撤销。 |
5 | COMMIT | 提交事务,最终转账操作生效。 |
当在未结束事务中设置保存点后,后续发生的任何操作,都可以通过ROLLBACK TO SAVEPOINT而撤销,数据和资源都将恢复到SAVEPOINT时的状态。
YashanDB在ROLLBACK TO SAVEPOINT时会做以下操作:
在指定SAVEPOINT前的数据和锁都不受影响,事务仍处于活跃状态,可以继续执行事务操作。
以下是一个使用SAVEPOINT的示例,若先执行ROLLBACK TO A,则A后面才记录的SAVEPOINT B将会自动释放:
sql 代码解读复制代码SAVEPOINT A;
INSERT INTO TEST_TABLE VALUES(1);
SAVEPOINT B;
DELETE FROM TEST_TABLE;
ROLLBACK TO B;
ROLLBACK TO A;
Copied!
自治事务时一种独立事务,可以在主事务中嵌套使用。YashanDB允许用户使用自治事务,可以在其中执行SQL操作,并独立结束自治事务。结束自治事务后,可以继续操作主事务。
自治事务一般用于必须独立执行的、不需要关注调用它的主事务最终如何结束的操作。自治事务具有以下特点:
在PL中,自治事务在发起后,可以自由使用一组SQL语句执行数据修改。在自治事务的范围内,资源独立于其父事务执行。
示例如下,详细用法可以查看PL参考手册中相关语法。
sql 代码解读复制代码CREATE OR REPLACE PROCEDURE AUTON_INSERT
AS
PRAGMA autonomous_transaction;
BEGIN
INSERT INTO test VALUES ( 'Autonomous Insert' );
INSERT INTO test VALUES ( 'Autonomous Insert' );
COMMIT;
END;
/
Copied!
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。