我正在寻找一种方法来确定当前会话中是否存在未提及的INSERT,UPDATE或DELETE语句.一种方法是使用当前sid检查v $ lock,但这需要对v $ lock的读访问权限,如果DBA不想授予它,这将是一个问题.任何其他方式(除了跟踪应用程序发出的所有数据库命令)?
有没有办法告诉我在交易中是否有未提交的工作(即DML)?也许我可以查询数据字典视图?
从运行开放事务的会话的内部和外部发现这一点的方法将是受欢迎的.
谢谢
有人告诉我,以下代码不会帮助我检查重复性,因为在SELECT和UPDATE语句之前结果可能有所不同。
PROCEDURE AddNew(Pname VARCHAR2, Pcountry VARCHAR2)
AS
already_exists BOOLEAN;
BEGIN
SELECT COUNT(*)>0 INTO already_exists FROM Publishers WHERE name=Pname;
IF already_exists THEN
RAISE_APPLICATION_ERROR(-20014,'Publisher already exists!');
END IF;
INSERT INTO Publishers(id,name,country)
VALUES (NewPublisherId(),Pname,Pcountry);
END;
Run Code Online (Sandbox Code Playgroud)
这篇文章声称SELECT启动了一个事务: 为什么仅从数据库视图中进行选择时为什么会得到未结事务?
文档的这一部分另有建议:
事务隐式地开始于获得TX锁定的任何操作:
发出修改数据的语句时
发出SELECT ... FOR UPDATE语句时
使用SET TRANSACTION语句或DBMS_TRANSACTION包显式启动事务时
所以?SELECT是否启动事务?