--SQL Server
select * from Tarifs with (NOWAIT);
select * from Tarifs with (READPAST);
select * from Tarifs with (NOLOCK);

select object_name(p.object_id) as TableName, resource_type, resource_description 
from sys.dm_tran_locks l join sys.partitions p on l.resource_associated_entity_id = p.hobt_id

kill -9 7328

--PostgreSQL
SELECT idTarif, hotel, typeChambre, DateDebut, DateFin, Prix FROM Tarifs WHERE hotel = 1
FOR UPDATE;

LOCK TABLE Tarifs IN SHARE MODE;

SELECT usename, state FROM pg_stat_activity
WHERE pid = 28;
 
-- Oracle
SELECT idTarif, hotel, typeChambre, DateDebut, DateFin, Prix FROM Tarifs WHERE hotel = 1
FOR UPDATE;

LOCK TABLE Tarifs IN SHARE MODE;

SELECT T1.OBJECT_ID, T2.OBJECT_NAME, T1.SESSION_ID FROM V$LOCKED_OBJECT 
T1, ALL_OBJECTS T2 WHERE T1.OBJECT_ID = T2.OBJECT_ID;

SELECT T3.SERIAL# ,T3.SID,T1.OBJECT_ID,T2.OBJECT_NAME,  
T1.SESSION_ID,T3.USERNAME,T3.STATUS,T3.OSUSER,T3.PROCESS  
FROM V$LOCKED_OBJECT T1, ALL_OBJECTS T2, V$SESSION T3 
WHERE T1.OBJECT_ID = T2.OBJECT_ID 
  AND T3.SID       = T1.SESSION_ID;

ALTER SYSTEM KILL SESSION '28,997';

SELECT T3.SERIAL# ,T3.SID,T1.OBJECT_ID,T2.OBJECT_NAME,  
T1.SESSION_ID,T3.USERNAME,T3.STATUS,T3.OSUSER,T3.PROCESS  
FROM V$LOCKED_OBJECT T1, ALL_OBJECTS T2, V$SESSION T3 
WHERE T1.OBJECT_ID = T2.OBJECT_ID 
  AND T3.SID       = T1.SESSION_ID;
  
 kill -9 7328

--MySQL
SELECT idTarif, hotel, typeChambre, DateDebut, DateFin, Prix FROM Tarifs WHERE hotel = 1
FOR UPDATE;

SELECT idTarif, hotel, typeChambre, DateDebut, DateFin, Prix FROM Tarifs WHERE hotel = 1 
LOCK IN SHARE MODE;

SELECT USER, STATE FROM information_schema.processlist
WHERE ID = 8


---Oracle, MySQL et PostgreSQL
ALTER TABLE chambres DROP CONSTRAINT FK_CHAMBRES_TYPESCHAMBRE;
ALTER TABLE TARIFS DROP CONSTRAINT FK_TARIFS_TYPESCHAMBRE;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 
  
/* Vidage de la table typeschambre */ 
DELETE FROM typeschambre; 
 
SELECT COUNT(*) FROM chambres WHERE hotel = 1;
--Première insertion dans la table typeschambre : lit simple
INSERT INTO typeschambre VALUES (1,1,'lit simple', '1 lit simple avec douche et WC');
--Première synchronisation
/* Positionnement du premier point */ 
SAVEPOINT ETAPE_NUMERO1; 
--Deuxième insertion dans la table typeschambre : lit double
INSERT INTO typeschambre VALUES (2,1,'lit double', '1 lit double avec douche et WC'); 
 
DELETE FROM CHAMBRES WHERE hotel = 1; 
 
SELECT * FROM typeschambre WHERE nombrelit = 1;
--Deuxième synchronisation
/* Positionnement du deuxième point */ 
SAVEPOINT ETAPE_NUMERO2;
 
INSERT INTO typeschambre VALUES (3,1, 'lit double', '1 lit double avec douche et WC'); 
 
/* Retour au point numéro 2 afin de ne pas insérer 2 fois le même type de chambre avec 1 lit double */ 
ROLLBACK TO ETAPE_NUMERO2; 
 
COMMIT; 

---SQL SERVER
USE RESAHOTEL

ALTER TABLE chambres DROP CONSTRAINT FK_CHAMBRES_TYPESCHAMBRE;
ALTER TABLE TARIFS DROP CONSTRAINT FK_TARIFS_TYPESCHAMBRE;

SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 
 BEGIN TRANSACTION 
/* Vidage de la table typeschambre */ 
DELETE FROM typeschambre; 

SELECT COUNT(*) FROM chambres WHERE hotel = 1;
--Première insertion dans la table typeschambre : lit simple
INSERT INTO typeschambre VALUES (1,1,'lit simple', '1 lit simple avec douche et WC');
--Première synchronisation
/* Positionnement du premier point */ 
SAVE TRANSACTION ETAPE_NUMERO1; 
--Deuxième insertion dans la table typeschambre : lit double
INSERT INTO typeschambre VALUES (2,1,'lit double', '1 lit double avec douche et WC'); 
 
DELETE FROM CHAMBRES WHERE hotel = 1; 
 
SELECT * FROM typeschambre WHERE nombrelit = 1;
--Deuxième synchronisation
/* Positionnement du deuxième point */ 
SAVE TRANSACTION ETAPE_NUMERO2;
 
INSERT INTO typeschambre VALUES (3,1, 'lit double', '1 lit double avec douche et WC'); 
 
/* Retour au point numéro 2 afin de ne pas insérer 2 fois le même type de chambre avec 1 lit double */ 
ROLLBACK TRANSACTION ETAPE_NUMERO2; 
 
COMMIT; 

