select version();
version
------------------------------------------------------------------------------------------
PostgreSQL 9.6.1 on x86_64-pc-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit
(1 ligne)
- session 0
CREATE TABLE t1(c1 SMALLINT);
CREATE TABLE
COMMIT;
COMMIT
-- session 1
INSERT INTO t1(c1) VALUES(1);
INSERT 0 1
-- session 2
START TRANSACTION;
START TRANSACTION
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET
SELECT * FROM t1;
c1
----
(0 ligne)
-- session 1
COMMIT;
COMMIT
-- session 2
SELECT * FROM t1;
c1
----
1
(1 ligne)
PostgreSQL accepte la syntaxe mais traite le niveau disolation READ UNCOMMITTED comme le niveau READ COMMITTED. Le premier "SELECT * FROM t1" de la session 2 ne voit pas la ligne de t1 insérée précédemment par une transaction en cours dans la session 1. Il est impossible davoir des lectures sales avec PostgreSQL. Il faut souligner que ce comportement est compatible avec le standard SQL. En effet le standard impose de NE PAS avoir de lecture sales à partir du niveau READ COMMITTED mais il nimpose pas davoir des lectures sales en READ UNCOMMITTED.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
-- session 0
SQL> CREATE TABLE t1(c1 SMALLINT);
Table created.
-- session 1
SQL> INSERT INTO t1 VALUES(1);
1 row created.
-- session 2
SQL> SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
*
ERROR at line 1:
ORA-02179: valid options: ISOLATION LEVEL { SERIALIZABLE | READ COMMITTED }
Oracle Database refuse tout simplement la syntaxe. Le niveau READ UNCOMMITTED nest donc implémenté ni par PostgreSQL, ni par Oracle. Ce niveau ne présente que très rarement un intérêt fonctionnel. Il pourrait présenter un intérêt en réduisant le verrouillage, et donc les temps dattente, dans le cas où le niveau READ COMMITTED nest pas requis. Puisque READ UNCOMMITTED permet de voir des données non validées, plus besoin dempêcher une transaction décrire des données en cours de lecture par une autre transaction. Alors, est-ce une limitation de PostgreSQL et Oracle ?