Estoy buscando una forma de averiguar si hay sentencias INSERT, UPDATE o DELETE sin compromiso en la sesión actual. Una forma sería verificar v $ lock con el sid actual, pero eso requiere acceso de lectura a v $ lock, que es un problema si el DBA no desea otorgarlo. ¿Alguna otra forma (aparte de hacer un seguimiento de todos los comandos de base de datos emitidos por la aplicación)?Oracle: ¿Cómo saber si hay una transacción pendiente?
Respuesta
se puede comprobar si la sesión tiene una fila en V$TRANSACTION
(obviamente eso requiere privilegio de leer en esta vista):
SQL> SELECT COUNT(*)
2 FROM v$transaction t, v$session s, v$mystat m
3 WHERE t.ses_addr = s.saddr
4 AND s.sid = m.sid
5 AND ROWNUM = 1;
COUNT(*)
----------
0
SQL> insert into a values (1);
1 row inserted
SQL> SELECT COUNT(*)
2 FROM v$transaction t, v$session s, v$mystat m
3 WHERE t.ses_addr = s.saddr
4 AND s.sid = m.sid
5 AND ROWNUM = 1;
COUNT(*)
----------
1
SQL> commit;
Commit complete
SQL> SELECT COUNT(*)
2 FROM v$transaction t, v$session s, v$mystat m
3 WHERE t.ses_addr = s.saddr
4 AND s.sid = m.sid
5 AND ROWNUM = 1;
COUNT(*)
----------
0
Hay casos donde este método no funciona, devolviendo falsos positivos: por ejemplo, si selecciona datos de una base de datos remota utilizando un enlace de base de datos (seleccione * from remotetable @ databaselink) oráculo inicie una transacción incluso si no alteró ningún dato. Este método no garantiza que tenga datos no confirmados. ... ¿conoce alguna forma de mejorar esta consulta para filtrar transacciones de este tipo? Realmente me desconcierta –
@CarloSirna Sí, hay casos en los que Oracle iniciará una transacción incluso si no modifica los datos. Conectarse a una base de datos remota es un ejemplo (vea por ejemplo [este hilo en Asktom] (https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:8908307196113)) Un simple 'SELECT ...FOR UPDATE' también iniciará una transacción sin modificar los datos. El método descrito en mi respuesta indica si tiene una transacción pendiente, no si tiene datos no confirmados. Los dos no son equivalentes (la modificación de los datos es suficiente, pero no necesaria para iniciar una transacción). –
SELECCIONAR * DESDE V $ TRANSACTION WHERE STATUS = 'ACTIVE';
Ver: http://forums.oracle.com/forums/thread.jspa?threadID=691061
Véase también ...
How can I tell if I have uncommitted work in an Oracle transaction?
:-) Diferentes descripciones ... "trabajo no confirmado" vs "transacción pendiente" – cagcowboy
Esta es la consulta que normalmente uso,
select s.sid
,s.serial#
,s.username
,s.machine
,s.status
,s.lockwait
,t.used_ublk
,t.used_urec
,t.start_time
from v$transaction t
inner join v$session s on t.addr = s.taddr;
funciona muy bien, también necesitaba matar la transacción inactiva después con ALTER SYSTEM KILL SESSION 'sid, serial #'; – Diizzy
Utilice la consulta a continuación para descubrir la transacción pendiente.
Si devuelve un valor, significa que hay una transacción pendiente.
Ésta es la consulta:
select dbms_transaction.step_id from dual
;
Referencias:
http://www.acehints.com/2011/07/how-to-check-pending-transaction-in.html http://www.acehints.com/p/site-map.html
Haz una TRANSACCIÓN CONJUNTA y luego ejecuta tu consulta. –
Matthew Watson puede ser modificado para ser utilizado en el RAC
select t.inst_id
,s.sid
,s.serial#
,s.username
,s.machine
,s.status
,s.lockwait
,t.used_ublk
,t.used_urec
,t.start_time
from gv$transaction t
inner join gv$session s on t.addr = s.taddr;
La solución más fácil y más fiable es tratar de iniciar una transacción y verlo si tiene éxito Si algún código ya inició una transacción pero aún no ha emitido ningún archivo DML, entonces la vista V $ TRANSACTION no mostrará nada.
En este ejemplo a continuación, manejo la excepción para generar un error de aplicación definido por el usuario. Para diferir a un manejador de excepciones existente, simplemente realice una TRANSACCIÓN CONJUNTA y luego COMIENCE de inmediato para deshacerla.
DECLARE
transaction_in_progress EXCEPTION;
PRAGMA EXCEPTION_INIT(transaction_in_progress, -1453);
BEGIN
SET TRANSACTION NAME 'CHECK_FOR_TRANSACTION_ALREADY_SET';
COMMIT; -- end transaction
EXCEPTION
WHEN transaction_in_progress THEN
RAISE_APPLICATION_ERROR(-20000,'Transaction is already in progress');
END;
/
- 1. ¿Cómo puedo saber si he trabajado sin compromiso en una transacción de Oracle?
- 2. ¿Cómo puedo saber si jQuery tiene pendiente una solicitud de Ajax?
- 3. Use gv $ session para saber si hay una consulta colgando
- 4. ¿Cómo puedo saber si Java es Sun/Oracle/OpenJDK?
- 5. Solucionar problemas del proceso pendiente de Oracle
- 6. Oracle DDL en transacción autónoma
- 7. WebSQL HTML5: ¿cómo saber cuándo finaliza una transacción de db?
- 8. Conexión ADO VB6 - ¿Cómo verificar si está en una transacción?
- 9. ¿Puedo obtener una referencia a una transacción pendiente desde un objeto SqlConnection?
- 10. Rails PaperClip Attachments, saber si hay una miniatura de imagen?
- 11. ¿Cómo saber si una cadena es xml?
- 12. Cómo verificar las operaciones pendientes en una transacción de PostgreSQL
- 13. ¿Cómo saber si hay demasiados mensajes de registro?
- 14. ¿Cómo saber si hay alguna petición Ajax y Ajax éxito
- 15. SVN: y bash: cómo saber si hay cambios no confirmados
- 16. ¿Cómo puedo saber si hay una página de php si alguien llegó por POST o GET?
- 17. ¿Cómo saber si una consulta escalará bien?
- 18. Indicando si una transacción tiene actualizaciones no confirmadas
- 19. cómo saber si XMLHttpRequest.send() funcionó
- 20. ¿Cómo se detecta si hay un índice para una columna específica en una tabla en Oracle?
- 21. Cómo comprobar si hay un vacío Gridview
- 22. ¿Cómo saber si una URL es una url de intranet?
- 23. ¿Cómo saber si una oración es una pregunta (interrogativa)?
- 24. cómo saber si una variable de JavaScript es una función
- 25. PHP ¿Cómo saber si una variable es una referencia?
- 26. ¿Cómo puedo saber si una variable VARCHAR contiene una subcadena?
- 27. ¿Cómo puedo saber si una tabla es una matriz?
- 28. ¿Cómo puedo saber si una propiedad es una colección genérica?
- 29. msysgit en Windows, ¿qué debo saber si hay alguno?
- 30. iOS: cómo saber si existe una cuenta de correo
Supongo que no tengo acceso a ninguna vista en V $. – Gren
posible duplicado de [¿Cómo puedo saber si he trabajado sin compromiso en una transacción de Oracle?] (Http://stackoverflow.com/questions/506456/how-can-i-tell-if-i-have-uncommitted-work -en-un-oráculo-transacción) –