Pour en savoir si deux lignes provenaient de même transaction dans Oracle
-
16-10-2019 - |
Question
J'utilise Oracle 11.1 et je voudrais savoir si deux lignes dans une table où Inséré par la même transaction.
Y at-il une instruction SQL facile à tracer une ligne à un identifiant de transactions? Le tableau est un insert seule table.
Quelles sont mes options? Une solution de baisc ferait, je ne veux pas vraiment quelque outil supplémentaire pour analyser les fichiers journaux.
Merci
La solution
Vous pouvez obtenir le SCN pour une ligne avec le ORA_ROWSCN Pseudo-
Sauf si vous avez défini le suivi de la dépendance au niveau de la ligne de la table, ce qui compte le SCN du dernier changement au bloc de la ligne est, qui ne peut être utilisé beaucoup. Vous pouvez activer le suivi de la dépendance au niveau de la ligne au moment de create table
seulement, de sorte que vous devrez peut-être laisser tomber et recréer votre table.
Notez que le suivi du niveau de la ligne augmente la taille de chaque rangée de 6 octets.
-
avec rowdependencies:
create table foo rowdependencies as select level as id from dual connect by level<=10000; select count(distinct ora_rowscn) from foo; COUNT(DISTINCTORA_ROWSCN) ------------------------- 1 begin for r in (select id from foo) loop update foo set id = id where id=r.id; commit; end loop; end; / select count(distinct ora_rowscn) from foo; COUNT(DISTINCTORA_ROWSCN) ------------------------- 10000
-
sans rowdependencies (norowdependencies par défaut):
create table bar as select level as id from dual connect by level<=10000; select count(distinct ora_rowscn) from bar; COUNT(DISTINCTORA_ROWSCN) ------------------------- 1 begin for r in (select id from bar) loop update bar set id = id where id=r.id; commit; end loop; end; / select count(distinct ora_rowscn) from bar; COUNT(DISTINCTORA_ROWSCN) ------------------------- 16
Autres conseils
Il n'y a aucun moyen fiable à 100% à la carte des lignes à des transactions, sauf si vous ajoutez des colonnes personnalisées.
Utilisation ORA_ROWSCN
, même avec ROWDEPENDENCIES
activé, ne sont pas toujours précis. Le test de Jack est correct, et montre qu'une seule transaction sauvera toutes les lignes avec le même SCN. Cependant, il est également possible pour un autre transaction pour créer une ligne avec le même SCN.
--Create a table with ROWDEPENDENCIES enabled.
drop table rowscn_test;
create table rowscn_test(a number) rowdependencies;
--Create 100 jobs to insert and commit one row.
begin
for i in 1 .. 100 loop
dbms_scheduler.create_job(
job_name => 'rowscn_'||i,
job_type => 'PLSQL_BLOCK',
job_action => 'begin insert into rowscn_test values(1); commit; end;',
enabled => true
);
end loop;
end;
/
--If ORA_ROWSCN was reliable then this query would not return any rows.
select ora_rowscn, count(*)
from rowscn_test
group by ora_rowscn
having count(*) > 1;
Exemple de résultats:
ORA_ROWSCN COUNT(*)
---------- --------
12124183417057 2
Les résultats ne sont pas déterministe et sera différent pour chaque système. Parfois, les ORA_ROWSCN
s sont uniques et la requête renvoie aucun résultat. Mais je ne me fierais pas à ce être toujours vrai.