文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

SELECT自动提交事务

概述

Oracle的事务状态控制与MogDB存在差异,Oracle对于只读命令不启动事务,对于写命令隐式启动事务,显式结束事务。MogDB的事务状态控制方式为隐式启动的事务隐式结束,显式启动的事务显式结束。对于读写等任何命令均需要在事务语义下执行。

当前驱动在非自动提交模式下,会显式地给内核发Begin,事务需要用户显式发Commit才能结束。这样会造成一个问题:一个表之前被一个只读连接访问过,则该连接就会一直存在一个Open状态的事务,该事务持有的资源不会被释放,从而阻塞truncate业务的执行。

本功能实现兼容Oracle事务状态的机制,驱动在非自动提交模式下不发Begin,对于只读命令,内核自动提交,对于写命令,需要用户显式提交。

使用说明

GUC参数behavior_compat_options新增配置项compat_oracle_txn_control。

  • 在驱动为非自动提交模式 (autocommit = off) 下,并且内核配置此参数:behavior_compat_options = 'compat_oracle_txn_control'; select自动提交事务功能开启,并且 compat_oracle_txn_control 选项在 JDBC 5.0.0.8 、Psycopg2 5.0.0.5 之后不允许通过 set behavior_compat_options 修改。

  • 在驱动为自动提交模式 (autocommit = on) 下,驱动版本为 JDBC 5.0.0.8 、Psycopg2 5.0.0.5 之后,即使内核配置此参数:behavior_compat_options = 'compat_oracle_txn_control'; select 自动提交事务功能也不会开启。

    注:在驱动为自动提交模式 (autocommit = on) 下,当驱动版本为JDBC 5.0.0.6/5.0.0.7、Psycopg2 5.0.0.4、ODBC 5.0.0.2时,如果打开此功能,会导致驱动的自动提交模式不生效。

  • 通过 JDBC setSavepointselect 不自动提交。

使用限制

  1. 此功能仅适用于A兼容模式。
  2. 对于驱动侧一条命令下发多条SQL语句,并且第一条语句不是start transcation/begin这种情况,所有SQL会一起自动提交。例如,set xxx; update xxxx;,set和update两条语句一起下发,update执行完成之后会自动提交,而非预期的显式提交。因此,使用时请注意使用单条语句书写,以避免需要显式提交的语句被自动提交。
  3. 对于函数/存储过程涉及游标OUT出参或者返回游标类型,执行完函数/存储过程之后自动提交,再次执行fetch操作,会报错找不到protal。

各场景下自动提交事务行为

  1. 单独的读命令自动提交(不含select for update/share/key share/no key update)
  2. 事务块内部的读命令不自动提交,需要显式提交
  3. 函数/存储过程内部的读命令不自动提交,函数内部只有读命令的话,执行完函数自动提交
  4. 单独的写命令需要显式提交(insert/update/delete/merge)
  5. 事务块内部的写命令不自动提交,需要显式提交
  6. 函数/存储过程内部的写命令不自动提交,需要显式提交
  7. 单独的DDL自动提交
  8. 事务块内部的DDL命令不自动提交,需要显式提交
  9. 函数/存储过程内部的DDL不自动提交,如果DDL不存在写行为,执行完函数自动提交
  10. 函数/存储过程内部的DDL不自动提交,如果DDL存在写行为,执行完函数需要显式提交
  11. 函数/存储过程内部存在子事务,不考虑子事务提交或者回滚,只看主事务是否存在写行为,如果存在写行为,需要显式提交,不存在写行为,自动提交。
  12. 对于特殊的DDL命令,比如explain、匿名块、execute,如果内部存在写行为,需要显式提交
  13. 对于单条lock命令,函数/存储过程内部的lock命令,内核会显式地放到事务块执行,需要显式提交
  14. 对于单条的declare cursor游标定义操作,内核会显式地放到事务块执行,需要显式提交。函数/存储过程内部的游标定义操作不会主动放到事务块执行,执行完函数自动提交。
  15. select into类语句需要先创建表,然后再插入数据,所以本质是DDL语句,会自动提交(5.0.8版本之后)。
  16. 为了不影响数据库初始化,该过程中此Oracle事务兼容功能默认关闭;启动数据库过程,该功能可以设置开启,并且不会影响正常启动。

各种SQL在不同场景下的行为描述

数据库对象 对象操作 单条语句 语句放在事务块 语句在函数/存储过程里面
TABLE SELECT 自动提交 显式提交 函数内部只有 select 读命令,执行完函数自动提交
SELECT FOR UPDATE 显式提交 显式提交 显式提交
SELECT FOR SHARE 显式提交 显式提交 显式提交
SELECT FOR KEY SHARE 显式提交 显式提交 显式提交
SELECT FOR NO KEY UPDATE 显式提交 显式提交 显式提交
INSERT 显式提交 显式提交 显式提交
UPDATE 显式提交 显式提交 显式提交
DELETE 显式提交 显式提交 显式提交
MERGE INTO 显式提交 显式提交 显式提交
DECLARE CURSOR DECLARE CURSOR 显式提交 显式提交 函数内部只有游标操作,没有写命令的话,执行完函数自动提交
CLOSE CURSOR CLOSE CURSOR 显式提交 显式提交 函数内部只有游标操作,没有写命令的话,执行完函数自动提交
MOVE/FETCH MOVE/FETCH 显式提交 显式提交 函数内部只有游标操作,没有写命令的话,执行完函数自动提交
TABLESPACE CREATE TABLESPACE 自动提交 语句不支持在事务块中执行 语句不支持在函数/存储过程中执行
ALTER TABLESPACE 自动提交 显式提交 显式提交
DROP TABLESPACE 自动提交 语句不支持在事务块中执行 语句不支持在函数/存储过程中执行
DATABASE CREATE DATABASE 自动提交 语句不支持在事务块中执行 语句不支持在函数/存储过程中执行
ALTER DATABASE 自动提交 显式提交 显式提交
DROP DATABASE 自动提交 语句不支持在事务块中执行 语句不支持在函数/存储过程中执行
TABLE CREATE TABLE 自动提交 显式提交 显式提交
ALTER TABLE 自动提交 显式提交 显式提交
TRUNCATE TABLE 自动提交 显式提交 显式提交
DROP TABLE 自动提交 显式提交 显式提交
SCHEMA CREATE SCHEMA 自动提交 显式提交 显式提交
ALTER SCHEMA 自动提交 显式提交 显式提交
DROP SCHEMA 自动提交 显式提交 显式提交
VIEW CREATE VIEW 自动提交 显式提交 显式提交
ALTER VIEW 自动提交 显式提交 显式提交
DROP VIEW 自动提交 显式提交 显式提交
PACKAGE CERATE PACKAGE 自动提交 不支持 不支持
CERATE PACKAGE BODY 自动提交 不支持 不支持
ALTER PACKAGE 自动提交 显式提交 显式提交
DROP PACKAGE 自动提交 显式提交 显式提交
TRIGGER CREATE TRIGGER 自动提交 显式提交 显式提交
ALTER TRIGGER 自动提交 显式提交 显式提交
DROP TRIGGER 自动提交 显式提交 显式提交
FUNCTION CREATE FUNCTION 自动提交 不支持 不支持
ALTER FUNCTION 自动提交 显式提交 显式提交
DROP FUNCTION 自动提交 显式提交 显式提交
ROLE CREATE ROLE 自动提交 显式提交 显式提交
ALTER ROLE 自动提交 显式提交 显式提交
DROP ROLE 自动提交 显式提交 显式提交
INDEX CREATE INDEX 自动提交 显式提交 显式提交
ALTER INDEX 自动提交 显式提交 显式提交
REINDEX 自动提交 显式提交 显式提交
DROP INDEX 自动提交 显式提交 显式提交
SEQUENCE CREATE SEQUENCE 自动提交 显式提交 显式提交
ALTER SEQUENCE 自动提交 语句不支持在事务块中执行 语句不支持在函数/存储过程中执行
DROP SEQUENCE 自动提交 显式提交 显式提交
USER CREATE USER 自动提交 显式提交 显式提交
ALTER USER 自动提交 显式提交 显式提交
DROP USER 自动提交 显式提交 显式提交
COMMENT COMMENT 自动提交 显式提交 显式提交
VACUUM VACUUM 自动提交 vacuum 不能放到事务块里面 vacuum 不能放到函数里面
EXPLAIN EXPLAIN 如果explain 语句存在写行为, 比如:explain analyze insert into tb1 values(1); 需要显式提交,否则自动提交 显式提交 如果explain 语句存在写行为, 比如:explain analyze insert into tb1 values(1); 需要显式提交,否则执行完函数自动提交
SHOW SHOW 自动提交 显式提交 执行完函数之后,自动提交
ALTER SYSTEM SET ALTER SYSTEM SET 自动提交 语句不支持在事务块中执行 语句不支持在函数/存储过程中执行
SET SET 自动提交 显式提交 执行完函数之后,自动提交
SHUTDOWN SHUTDOWN 自动提交 会在提交前执行,提交后当前session会关闭 会在提交前执行,提交后当前session会关闭
ANONYMOUS BLOCK EXECUTE ANONYMOUS BLOCK EXECUTE 如果匿名块语句存在写行为, 比如: begin insert into tb1 values(1); end; / 需要显式提交,否则自动提交 显式提交 如果匿名块语句存在写行为, 比如: begin insert into tb1 values(1); end; / 需要显式提交,否则执行完函数自动提交
LOCK TABLE LOCK TABLE 显式提交 显式提交 显式提交
SET CONSTRAINTS SET CONSTRAINTS 自动提交 显式提交 执行完函数之后,自动提交
CHECKPOINT CHECKPOINT 自动提交 显式提交 执行完函数之后,自动提交
SHRINK SHRINK 自动提交 显式提交 显式提交
CREATE RULE CREATE RULE 自动提交 显式提交 显式提交
TYPE CREATE TYPE 自动提交 显式提交 显式提交
ALTER TYPE 自动提交 显式提交 显式提交
EVENT TRIGGER CREATE EVENT TRIGGER 自动提交 显式提交 显式提交
ALTER EVENT TRIGGER 自动提交 显式提交 显式提交
DROP EVENT TRIGGER 自动提交 显式提交 显式提交
PURGE PURGE TABLE 自动提交 显式提交 显式提交
PURGE INDEX 自动提交 显式提交 显式提交
PURGE RECYCLEBIN 自动提交 显式提交 显式提交
TimeCapsule Table TimeCapsule Table 自动提交 显式提交 显式提交
PREPARE PREPARE 自动提交 显式提交 执行完函数之后,自动提交
EXECUTE EXECUTE 如果execute 语句存在写行为, 比如:execute (insert into tb1 values(1)); 需要显式提交,否则自动提交 显式提交 如果execute 语句存在写行为, 比如:execute (insert into tb1 values(1)); 需要显式提交,否则执行完函数自动提交
COPY COPY 自动提交 显式提交 显式提交
LOAD LOAD 自动提交 显式提交 显式提交
DEALLOCATE DEALLOCATE 自动提交 显式提交 执行完函数之后,自动提交
GRANT 自动提交 显式提交 显式提交
REVOKE 自动提交 显式提交 显式提交
GRANT ROLE GRANT ROLE 自动提交 显式提交 显式提交
REVOKE ROLE REVOKE ROLE 自动提交 显式提交 显式提交
EVENT CREATE EVENT 自动提交 显式提交 显式提交
ALTER EVENT 自动提交 显式提交 显式提交
DROP EVENT 自动提交 显式提交 显式提交
OWNED DROP OWNED 自动提交 显式提交 显式提交
DEFAULT PRIVILEGES ALTER DEFAULT PRIVILEGES 自动提交 显式提交 显式提交
MATERIALIZED VIEW REFRESH MATERIALIZED VIEW 自动提交 显式提交 显式提交
Copyright © 2011-2024 www.enmotech.com All rights reserved.