Bonjour,
c'est quoi la différence entre dbms_lock et lock_table?
aussi, est ce qu'il y a moyen de locker sur des enregistrements particuliers, sachant que ces enregistrement proviennent d'un jointure entre plusieurs tables?
Bonjour,
c'est quoi la différence entre dbms_lock et lock_table?
aussi, est ce qu'il y a moyen de locker sur des enregistrements particuliers, sachant que ces enregistrement proviennent d'un jointure entre plusieurs tables?
DBMS_LOCK est un package permettant d'utiliser directement les services de verrouillage sans que les verrous soient forcémént liés à une table ou une ligne dans une table.
Le seuil moyen de verrouiller explicitement des lignes dans des tables est d'utiliser la clause FOR UPDATE de la commande SELECT: la clause OF permet de restreindre le verrouillage à un sous-ensemble de tables (sinon toutes les lignes retournées par le SELECT de toutes les tables concernées sont verrouillées):
http://download-uk.oracle.com/docs/c...2.htm#i2130052
Merci pour ta réponse, seulement j'ai une requête de ce type:
et je veux faire le lock sur cold1 et cold2 de la table Table2.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 select cold1, cold2 into did,o_ip from (select d.cold1, d.cold2 from table1 p, table2 d where d.cold3=p.col1 and p.col1=parametre order by d.cold1 ) where rownum = 1 for update;
est ce que le for update marche toujours dans ce cas?
merci
AEMAG
un update d'une vue... m'est avis que ça va pas trop bien marcher![]()
oui, ça ne marche pas du tout, en plus j'ai oublié qu'on ne fait pas un update for dans c conditions![]()
quelqu'un voit une piste pour ce que je veux faire?
Code : Sélectionner tout - Visualiser dans une fenêtre à part ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc.
merci
en passant par un curseur probablement... là tu sélectionnes une colonne de chacune des tables alors évidemment Oracle ne sait pas quoi locker
D'ailleurs, ordonné sur une colonne qui n'est pas de la table à mettre à jour c'est pour le moins curieux![]()
Bonjour,
j'exécute les deux scripts suivants :
et ensuite
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 declare v_result number; v_lockhandle varchar2(200); begin dbms_lock.allocate_unique('control_lock', v_lockhandle); v_result := dbms_lock.request(v_lockhandle, dbms_lock.ss_mode); if v_result <> 0 then dbms_output.put_line( case when v_result=1 then 'Timeout' when v_result=2 then 'Deadlock' when v_result=3 then 'Parameter Error' when v_result=4 then 'Already owned' when v_result=5 then 'Illegal Lock Handle' end); end if; insert into lock_test values ('started', sysdate); dbms_lock.sleep(5); insert into lock_test values ('ended' , sysdate); commit; end; /
j'ai deux questions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 declare v_lockhandle varchar2(200); v_result number; begin dbms_lock.allocate_unique('control_lock', v_lockhandle); v_result := dbms_lock.release(v_lockhandle); if v_result <> 0 then dbms_output.put_line( case when v_result=1 then 'Timeout' when v_result=2 then 'Deadlock' when v_result=3 then 'Parameter Error' when v_result=4 then 'Already owned' when v_result=5 then 'Illegal Lock Handle' end); end if; end; /
- pourquoi quand je fait select * from dbms_lock_allocated j'obient toujours 'control_lock' dans les données alors que j'ai déjà fait un release?
- j'obitent des fois comme code de retour de dbms_lock.release ou dbms_lock.request la valeur 4, ce qui signifie : "Already own lock specified by id or lockhandle". comment corriger le problème surtout que je suis toujours dans la même section?
merci
AEMAG
Partager