Apa itu transaction?
Sebuah transaksi adalah sekelompok perintah yang harus dijalankan, hasilnya berhasil atau gagal untuk semua perintah tersebut
Apa pentingnya transaction?
Lihat contoh berikut : misal diperlukan perubahan stok setiap kali ada penjualan 1 item barang
lat 1
CREATE TABLE tbCustomer
(
IdCust varchar(10),
Customer varchar(30),
primary key (IdCust)
)
--lihat data sebelum di update
SELECT * FROM tbCustomer
BEGIN TRAN
--lakukan insert
INSERT tbCustomer VALUES ('001','Nugraha')
INSERT tbCustomer VALUES ('002', 'Agung')
--lihat data sesudah diinsert
SELECT * FROM tbCustomer
ROLLBACK TRAN
--lihat data sesudah dirollback
SELECT * FROM tbCustomer
lat 2
--lihat data sebelum diupdate
SELECT * FROM tbCustomer
BEGIN TRAN
--lakukan insert
INSERT tbCustomer VALUES ('001','Nugraha')
INSERT tbCustomer VALUES ('002', 'Agung')
--lihat data sesudah diinsert
SELECT * FROM tbCustomer
COMMIT TRAN
--lihat data sesudah dirollback
SELECT * FROM tbCustomer
lat 3
--lihat data sebelum diupdate
SELECT * FROM tbCustomer
BEGIN TRAN
--lakukan insert
INSERT tbCustomer VALUES ('001','Nugraha')
INSERT tbCustomer VALUES ('002', 'Agung')
INSERT tbCustomer VALUES ('003', 'Michael')
IF @@ERROR != 0
BEGIN
PRINT 'ERROR, Insert data gagal'
ROLLBACK TRAN
END
ELSE
BEGIN
PRINT 'Berhasil'
COMMIT TRAN
END
GO
--lihat data sesudah di rollback
SELECT * FROM tbCustomer
lat 4
CREATE TABLE tbCustomer1 (
IdCust varchar(10),
Customer varchar(30),
Piutang money default 0,
primary key (IdCust)
)
CREATE TABLE tbJual(
NoJual varchar(10),
IdCust varchar(10),
Jumlah money,
primary key (NoJual)
)
CREATE PROCEDURE spInsert
@NoJual varchar(10),
@IdCust varchar(10),
@Jumlah money
AS
DECLARE @piutang money
BEGIN TRAN
SELECT @piutang = piutang from dbo.tbCustomer1 WHERE IdCust = @IdCust
IF @piutang is null SET @piutang=0
UPDATE dbo.tbCustomer1 SET Piutang=@piutang + @Jumlah WHERE IdCust=@IdCust
INSERT dbo.tbJual (NoJual, IdCust, Jumlah) VALUES (@NoJual, @IdCust, @Jumlah)
IF @@ERROR != 0
ROLLBACK TRAN
ELSE
COMMIT TRAN
INSERT dbo.tbCustomer1(IdCust,Customer,Piutang) VALUES ('C001','Antoni',0)
SELECT * FROM dbo.tbCustomer1
exec dbo.spInsert 'J001', 'C001',1000
SELECT * FROM dbo.tbCustomer1
SELECT * FROM dbo.tbCustomer1
exec dbo.spInsert 'J002', 'C001',1000
SELECT * FROM dbo.tbCustomer1
lat 5
create table tbNilai (
nim varchar(7),
kodemk varchar(7),
nilai char(1),
primary key (nim,kodemk)
)
create trigger trTbNilai_Insert on tbNilai
for insert, update
as
declare @nilai char(1)
select @nilai=nilai from inserted
if @nilai not in ('A','B','C','D','E')
begin
raiserror ('nilai harus A-E', 1,1)
ROLLBACK TRANSACTION
end
insert dbo.tbNilai values ('001','IF002','A')
select * from dbo.tbNilai
insert dbo.tbNilai values ('002','IF002','B')
select * from dbo.tbNilai
insert dbo.tbNilai values ('003','IF002','F')
select * from dbo.tbNilai
LATIHAN TRIGGER DAN TRANSACTION HUTANG
1.Buat DBhutang
2.Buat Tabel
a.Pemasok (IDPemasok, Nama, Hutang),
b.Beli (IDBeli, IDPemasok, TotalBeli),
c.Bayar (IDBayar, IDPemasok, TotalBayar)
3.Buat Relasi antara Pemasok dengan Beli dan Pemasok dengan Bayar
4.Buat TrgInsertBeli (menempel pada table Beli) yang fungsinya menambah Hutang pada table Pemasok.
5.dan TrgInsertBayar (menempel pada table Bayar) yang fungsinya mengurangi Hutang pada table Pemasok.
Untuk menguji TrgInsertBeli :
--Data Hutang Pelasok sebelumnya
Select * from Pemasok
--Insert Pembelian
Insert Into Beli …..
--Data Hutang Pemasok sesudahnya
Select * from Beli
Select * from Pemasok
Untuk menguji TrgInsertBayar :
--Data Hutang Pemasok sebelumnya
Select * from Pemasok
--Insert Pembayaran
Insert Into Bayar …..
--Data Hutang Pemasok sesudahnya
Select * from Bayar
Select * from Pemasok
CREATE TRIGGER TrgInsertBeli
ON dbo.Beli
AFTER INSERT
AS
BEGIN
DECLARE @IDPemasok nvarchar(50)
DECLARE @TotalBeli money
SET NOCOUNT ON;
SELECT @IDPemasok=IDPemasok,@TotalBeli=TotalBeli
FROM INSERTED
UPDATE dbo.Pemasok
SET Hutang = Hutang + @TotalBeli
WHERE @IDPemasok=IDPemasok
END
GO
--Data Hutang Pelasok sebelumnya
Select * from Pemasok
Insert Into Pemasok(IDPemasok,Nama,Hutang)
values ('P002','william',10000)
--Insert Pembelian
Insert Into Beli(IDBeli,IDPemasok,TotalBeli)
values ('B003','P001',5000)
--Data Hutang Pemasok sesudahnya
Select * from Beli
Select * from Pemasok
CREATE TRIGGER TrgInsertBayar
ON dbo.Bayar
AFTER INSERT
AS
BEGIN
DECLARE @IDPemasok nvarchar(50)
DECLARE @TotalBayar money
SET NOCOUNT ON;
SELECT @IDPemasok=IDPemasok,@TotalBayar=TotalBayar
FROM INSERTED
UPDATE dbo.Pemasok
SET Hutang = Hutang - @TotalBayar
WHERE @IDPemasok=IDPemasok
END
GO
--Data Hutang Pemasok sebelumnya
Select * from Pemasok
--Insert Pembayaran
Insert Into Bayar(IDBayar,IDPemasok,TotalBayar)
values('B002','P001',20000)
--Data Hutang Pemasok sesudahnya
Select * from Bayar
Select * from Pemasok
1.Buat SP_BukuTabungan menggunakan cursor yang menampilkan isi buku tabungan tiap nasabah dengan format tampilan : (contoh salah satu nasabah… diminta untuk membuat semua nasabah)
------------------------------------------------------------------------------------------------------------------------------------------
No Rekening : 200202050000003
Jenis Tabungan : Giro
Nama : Heidy
Alamat : Cimahi
-------------------------------------------------------------------------------------------------------------------------------------------
No. Tanggal NIK Keterangan Debet Kredit Saldo
-------------------------------------------------------------------------------------------------------------------------------------------
1 9/3/2009 ATM Tunai ATM 200000 0 4050000
2 9/4/2009 ATM Transfer ke 200401010000001 750000 0 3300000
3 9/4/2009 T-0002 Setoran Tunai 0 200000 3500000
-------------------------------------------------------------------------------------------------------------------------------------------
Simpan source codenya dalam SP_BukuTabungan.sql dan simpan screen shot hasil execnya di SPBuku.jpeg (bila tidak muat buat bbrp screen shot, beri nomor spt SPBuku1, SPBuku2, dst) BOBOT : 35
BEGIN
DECLARE csrNasabah CURSOR
FOR SELECT No_Rekening, Jenis_Tabungan, Nama, Alamat FROM tbNasabah
OPEN csrNasabah
DECLARE @NoRek varchar(15)
DECLARE @JenTab varchar(20)
DECLARE @Nama varchar(50)
DECLARE @Alamat varchar(100)
FETCH NEXT FROM csrNasabah into @NoRek, @JenTab, @Nama, @Alamat
WHILE @@FETCH_STATUS=0
BEGIN
PRINT '----------------------------------------------------------------------------------------------------'
PRINT 'No Rekening : '+@NoRek
PRINT 'Jenis Tabungan : '+@JenTab
PRINT 'Nama : '+@Nama
PRINT 'Alamat : '+@Alamat
PRINT '----------------------------------------------------------------------------------------------------'
PRINT 'No. Tanggal NIK Keterangan Debet Kredit Saldo'
PRINT '----------------------------------------------------------------------------------------------------'
DECLARE csrTransaksi CURSOR
FOR SELECT Tanggal, NIK, Keterangan, Jenis_trans, Jumlah, Saldo FROM tbTransaksi WHERE No_Rekening = @NoRek
OPEN csrTransaksi
DECLARE @No int SET @No = 1
DECLARE @Tanggal smalldatetime
DECLARE @NIK char(10)
DECLARE @Keterangan char(30)
DECLARE @Jenis varchar(20)
DECLARE @Jumlah money
DECLARE @Saldo money
DECLARE @JumlahD money
DECLARE @JumlahK money
FETCH FROM csrTransaksi into @Tanggal, @NIK, @Keterangan, @Jenis, @Jumlah, @Saldo
WHILE @@FETCH_STATUS=0
BEGIN
IF (@Jenis = 'Debet')
BEGIN
SET @JumlahD = @Jumlah
SET @JumlahK = 0
END
ELSE
BEGIN
SET @JumlahD = 0
SET @JumlahK = @Jumlah
END
PRINT CONVERT(char(5),@No)+''+CONVERT(char(12),@Tanggal)+' '+@NIK+' '+@Keterangan+' '+CONVERT(char(12),@JumlahD)+''+CONVERT(char(12),@JumlahK)+''+CONVERT(char(12),@Saldo)
SET @No = @No + 1
FETCH NEXT FROM csrTransaksi into @Tanggal, @NIK, @Keterangan, @Jenis, @Jumlah, @Saldo
END
PRINT '----------------------------------------------------------------------------------------------------'
PRINT ''
PRINT ''
CLOSE csrTransaksi
DEALLOCATE csrTransaksi
FETCH NEXT FROM csrNasabah into @NoRek, @JenTab, @Nama, @Alamat
END
CLOSE csrNasabah
DEALLOCATE csrNasabah
END
-- Create table to work with
CREATE TABLE MyTranTest
(
OrderID INT PRIMARY KEY IDENTITY
)
select * from mytrantest ---------------------(A)
BEGIN TRAN TranStart
INSERT INTO MyTranTest
DEFAULT VALUES
INSERT INTO MyTranTest
DEFAULT VALUES
INSERT INTO MyTranTest
DEFAULT VALUES
INSERT INTO MyTranTest
DEFAULT VALUES
select * from mytrantest ---------------------(B)
SAVE TRAN FirstPoint
INSERT INTO MyTranTest
DEFAULT VALUES
INSERT INTO MyTranTest
DEFAULT VALUES
INSERT INTO MyTranTest
DEFAULT VALUES
select * from mytrantest ---------------------(C)
ROLLBACK TRAN FirstPoint
select * from mytrantest ---------------------(D)
INSERT INTO MyTranTest
DEFAULT VALUES
INSERT INTO MyTranTest
DEFAULT VALUES
INSERT INTO MyTranTest
DEFAULT VALUES
select * from mytrantest ---------------------(E)
SAVE TRAN SecondPoint
INSERT INTO MyTranTest
DEFAULT VALUES
INSERT INTO MyTranTest
DEFAULT VALUES
INSERT INTO MyTranTest
DEFAULT VALUES
select * from mytrantest ---------------------(F)
ROLLBACK TRAN SecondPoint
select * from mytrantest
INSERT INTO MyTranTest
DEFAULT VALUES
INSERT INTO MyTranTest
DEFAULT VALUES
INSERT INTO MyTranTest
DEFAULT VALUES
select * from mytrantest ---------------------(G)
COMMIT TRAN TranStart
SELECT TOP 3 OrderID
FROM MyTranTest
ORDER BY OrderID ASC ---------------------(H)
Tidak ada komentar:
Posting Komentar