SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Posted: Fri 22 Nov 2019 05:17
When declaring 'StartTransaction' in Delphi
When using the 'SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED' statement
MariaDB and SQLServer get no error.
PostgreSQL gives an error.
==> SET TRANSACTION ISOLATION LEVEL must be called before any query
By default, PostTransSQL changes to READ committed when StartTransaction is executed in unidac even if SET TRANSACTION ISOLATION LEVEL READ uncommitted is declared.
delphi
sql server
procedure TForm1.Button8Click(Sender: TObject);
var
SQLText : string;
begin
SQLText := 'exec TR_TEST ''' + 'aa' + '''';
MyQuery2(UniConnection1, UniQuery1,SQLText);
end;
MariaDB
procedure TForm1.Button7Click(Sender: TObject);
var
SQLText : string;
begin
SQLText := 'call TR_TEST (''' + 'aa' + ''')';
MyQuery2(UniConnection2, UniQuery2,SQLText);
end;
postgreSQL
procedure TForm1.Button9Click(Sender: TObject);
var
SQLText : string;
begin
SQLText := 'select * from TR_TEST (''' + 'aa' + ''')';
MyQuery2(UniConnection3, UniQuery3,SQLText);
end;
procedure TForm1.MyQuery2(UniConnection : TUniConnection; Query : TUniQuery; SQLString : string);
begin
try
UniConnection.StartTransaction;
Query.Close;
Query.SQL.Clear;
Query.SQL.Text := SQLString;
Query.ExecSQL;
UniConnection.Commit;
except on E:EUniError do begin
UniConnection.Rollback;
Memo1.Lines.Add(IntToStr(E.ErrorCode));
Memo1.Lines.Add(E.Message);
end;
end;
end;
ex)
Table(Common table)
CREATE TABLE TEST00 (
TEST1 VARCHAR(50)
);
1. SQL Server Stored Procedure
CREATE PROCEDURE TR_TEST
@i_TEST1 VARCHAR(50)
AS
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
INSERT INTO TEST00
(TEST1)
VALUES
(@i_TEST1);
SET NOCOUNT OFF
2. MariaDB Stored Procedure
CREATE OR REPLACE PROCEDURE TR_TEST(
$i_TEST1 VARCHAR(50)
)
BEGIN
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
INSERT INTO TEST00
(TEST1)
VALUES
($i_TEST1);
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
END;
3. postgreSQL Stored Procedure
CREATE OR REPLACE FUNCTION public.TR_TEST(
i_TEST1 character varying
)
RETURNS void AS
$BODY$
BEGIN
SET TRANSACTION ISOLATION LEVEL READ uncommitted;
INSERT INTO TEST00
(TEST1)
VALUES
(i_TEST1);
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
When using the 'SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED' statement
MariaDB and SQLServer get no error.
PostgreSQL gives an error.
==> SET TRANSACTION ISOLATION LEVEL must be called before any query
By default, PostTransSQL changes to READ committed when StartTransaction is executed in unidac even if SET TRANSACTION ISOLATION LEVEL READ uncommitted is declared.
delphi
sql server
procedure TForm1.Button8Click(Sender: TObject);
var
SQLText : string;
begin
SQLText := 'exec TR_TEST ''' + 'aa' + '''';
MyQuery2(UniConnection1, UniQuery1,SQLText);
end;
MariaDB
procedure TForm1.Button7Click(Sender: TObject);
var
SQLText : string;
begin
SQLText := 'call TR_TEST (''' + 'aa' + ''')';
MyQuery2(UniConnection2, UniQuery2,SQLText);
end;
postgreSQL
procedure TForm1.Button9Click(Sender: TObject);
var
SQLText : string;
begin
SQLText := 'select * from TR_TEST (''' + 'aa' + ''')';
MyQuery2(UniConnection3, UniQuery3,SQLText);
end;
procedure TForm1.MyQuery2(UniConnection : TUniConnection; Query : TUniQuery; SQLString : string);
begin
try
UniConnection.StartTransaction;
Query.Close;
Query.SQL.Clear;
Query.SQL.Text := SQLString;
Query.ExecSQL;
UniConnection.Commit;
except on E:EUniError do begin
UniConnection.Rollback;
Memo1.Lines.Add(IntToStr(E.ErrorCode));
Memo1.Lines.Add(E.Message);
end;
end;
end;
ex)
Table(Common table)
CREATE TABLE TEST00 (
TEST1 VARCHAR(50)
);
1. SQL Server Stored Procedure
CREATE PROCEDURE TR_TEST
@i_TEST1 VARCHAR(50)
AS
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
INSERT INTO TEST00
(TEST1)
VALUES
(@i_TEST1);
SET NOCOUNT OFF
2. MariaDB Stored Procedure
CREATE OR REPLACE PROCEDURE TR_TEST(
$i_TEST1 VARCHAR(50)
)
BEGIN
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
INSERT INTO TEST00
(TEST1)
VALUES
($i_TEST1);
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
END;
3. postgreSQL Stored Procedure
CREATE OR REPLACE FUNCTION public.TR_TEST(
i_TEST1 character varying
)
RETURNS void AS
$BODY$
BEGIN
SET TRANSACTION ISOLATION LEVEL READ uncommitted;
INSERT INTO TEST00
(TEST1)
VALUES
(i_TEST1);
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;