SQL Server

SQL Server

Saya sering mendengar bahwa “saya tidak memerlukan transaction jika menggunakan stored procedure”.

Banyak orang yang masih salah dengan konsep ini. Transaction tidak berarti tanpa stored procedure. Berikut saya contohkan querynya.

 

USE tempdb
GO

-- Create 3 Test Tables
CREATE TABLE TABLE1 (ID INT);

CREATE TABLE TABLE2 (ID INT);

CREATE TABLE TABLE3 (ID INT);
GO

-- Create SP
CREATE PROCEDURE TestSP
AS
INSERT INTO TABLE1 (ID)
VALUES (1)

INSERT INTO TABLE2 (ID)
VALUES ('a')

INSERT INTO TABLE3 (ID)
VALUES (3)
GO

-- Execute SP
-- SP will error out
EXEC TestSP
GO

-- Check the Values in Table
SELECT *
FROM TABLE1;

SELECT *
FROM TABLE2;

SELECT *
FROM TABLE3;
GO

 

Yang menjadi masalah utama, jika stored procedure tidak menggunakan transaction, maka jika ada kesalahan tentu tidak akan rollback terhadap proses sebelumnya. Berikut hasil jika query diatas dijalankan.

 

Hasil Eksekusi

 

Sekarang saya akan mencoba memberikan contoh stored procedure yang memiliki transaction sehingga menjadi satu batch T-SQL. Caranya cukup sederhana, awal dan akhir stored procedure diisi dengan BEGIN TRAN dan COMMIT TRAN. Sehingga jika diterapkan dengan contoh diatas dengan contoh stored procedure yang baru maka akan menjadi seperti ini :

 

CREATE PROCEDURE TestSPTran
AS
BEGIN TRAN

INSERT INTO TABLE1 (ID)
VALUES (11)

INSERT INTO TABLE2 (ID)
VALUES ('b')

INSERT INTO TABLE3 (ID)
VALUES (33)

COMMIT
GO

-- Execute SP
EXEC TestSPTran
GO

-- Check the Values in Tables
SELECT *
FROM TABLE1;

SELECT *
FROM TABLE2;

SELECT *
FROM TABLE3;
GO

-- Clean up
DROP TABLE Table1

DROP TABLE Table2

DROP TABLE Table3
GO

 

Jika dilihat dari hasilnya, maka tidak akan ada data yang masuk jika ada kesalahan yang terjadi di dalam stored procedure. Hal ini tentu akan lebih membuat data semakin valid jika ada proses update atau delete dilakukan.

Untuk lebih lanjut, silakan menuju link dari MSDN Microsoft berikut ini :

https://msdn.microsoft.com/en-us/library/ms190295.aspx

 

HMS