Kamis, 20 Januari 2011

Bahan 12 - Transaction

1.    Apa itu transaction?
Sebuah transaksi adalah sekelompok perintah yang harus dijalankan, hasilnya berhasil atau gagal untuk semua perintah tersebut
2.    Apa pentingnya transaction?
Lihat contoh berikut : missal diperlukan perubahan stok setiap kali ada penjualan 1 item barang

Update Inventory
Set qty = qty – 1
Where item_id=2012

Insert  Sales_detail (item_id, inv_id, datesold, qty)
Values(2012, 308, current_timestamp, 1)

BEGIN TRAN
Update Inventory
Set qty = qty – 1
Where item_id=2012

Insert  Sales_detail (item_id, inv_id, datesold, qty)
Values(2012, 308, current_timestamp, 1)
COMMIT TRAN

LATIHAN 1:
  --LIHAT DATA SEBELUM DIUPDATE
  select * from FB
  BEGIN TRAN
  --LAKUKAN UPDATE
  update FB
  set tempo=200 where KODEPELANGGAN='S-00002'
 
  update FB
  set tempo=300 where KODEPELANGGAN='S-00003'
 
  --LIHAT DATA SESUDAH DIUPDATE
  select * from FB

  --LAKUKAN ROLLBACK
  ROLLBACK TRAN

  --LIHAT DATA SESUDAH ROLLBACK
  select * from FB

LATIHAN 2 :
  --LIHAT DATA SEBELUM DIUPDATE
  select * from FB
  BEGIN TRAN
  --LAKUKAN UPDATE
  update FB
  set tempo=200 where KODEPELANGGAN='S-00002'
 
  update FB
  set tempo=300 where KODEPELANGGAN='S-00003'
 
  --LIHAT DATA SESUDAH DIUPDATE
  select * from FB

  --LAKUKAN COMMIT
  COMMIT

  --LIHAT DATA SESUDAH COMMIT
  select * from FB

LATIHAN 3 :
select * from fb
BEGIN TRAN
      insert into fb(NoFJ,KodePelanggan,tglFJ,totalfaktur)
      VALUES ('FB-3','S-00002','2007-11-06 12:12:12','10000')
     
      update Supplier
      set Piutang = Piutang+10000 where KODEPELANGGAN ='S-00002'

      select * from fb
      select * from supplier

COMMIT

CREATE TABLE tbCustomer
(
IdCust varchar(10),
Customer varchar(30),
primary key (IdCust)
)

--lihat data sebelum di update
SELECT * FROM tbCustomer --data msh kosong
BEGIN TRAN

--lakukan insert
INSERT tbCustomer VALUES ('001','Nugraha')
INSERT tbCustomer VALUES ('002', 'Agung')

--lihat data sesudah diinsert
SELECT * FROM tbCustomer --data sudah terisi 2 data

ROLLBACK TRAN

--lihat data sesudah dirollback
SELECT * FROM tbCustomer -- data kmbl kosong


--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 --data sudah terisi 2 data

COMMIT TRAN --data tersimpan dan tak bs di rollback

--lihat data sesudah dirollback
SELECT * FROM tbCustomer --menampilkan data terkahir yg diinsert

--lihat data sebelum diupdate
SELECT * FROM tbCustomer
BEGIN TRAN

--lakukan insert
INSERT tbCustomer VALUES ('001','Nugraha') --gagal
INSERT tbCustomer VALUES ('002', 'Agung') --gagal
INSERT tbCustomer VALUES ('003', 'Michael') --data 1 dan 2 tidak dapat terinsert krn sebelumnya sudah diinsert, hny data 3 yg bs diinsert

IF @@ERROR != 0
BEGIN 
PRINT 'ERROR, Insert data gagal'
ROLLBACK TRAN --kalau eror, data akan di rollback
END
ELSE
BEGIN
PRINT 'Berhasil'
COMMIT TRAN --kalau tdk tjd eror maka data akan di commit
END
GO

--lihat data sesudah di rollback
SELECT * FROM tbCustomer


CREATE TABLE tbCustomer1 (
IdCust varchar(10),
Customer varchar(30),
Piutang money default 0,
primary key (IdCust)
) --membuat table baru

CREATE TABLE tbJual(
NoJual varchar(10),
IdCust varchar(10),
Jumlah money,
primary key (NoJual)
) --membuat table baru

CREATE PROCEDURE spInsert --membuat proc insert
@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 --menegecek jika piutang null makan di set nilainy mjd 0
UPDATE  dbo.tbCustomer1 SET Piutang=@piutang + @Jumlah WHERE IdCust=@IdCust --mengupdate isi dari nilai piutang
INSERT dbo.tbJual (NoJual, IdCust, Jumlah) VALUES (@NoJual, @IdCust, @Jumlah) --menginsert data ke dalam table jual
IF @@ERROR != 0 
ROLLBACK TRAN --jika eror maka data akan di rollback
ELSE
COMMIT TRAN --jika tdk eror maka data akan dicommit

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

create table tbNilai (
nim varchar(7),
kodemk varchar(7),
nilai char(1),
primary key (nim,kodemk)
) --membuat table baru

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 --jika nilai tdk sesuai persyaratan maka data akan dirollback
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


Tidak ada komentar:

Posting Komentar