Contoh Transaction Database Microsoft SQL Server dalam C#

Contoh Transaction Database Microsoft SQL Server dalam C#

Sebelumnya ane jelasin dulu nih kegunaan Transaction Database dalam sebuah kasus pengolahan basis data.  Ceritanya seampuh apapun suatu sistem basis data maupun koneksi, pasti ada aja hal-hal mistis yang bisa membuat sebuah sistem kolaps, time out, atau nge hung, atau apapun itu, yang jelas gangguan yang tidak bisa di prediksi.

Nah kalau gangguan yang tidak bisa diprediksi ini hanya seputar menampilkan data atau membuka halaman sih gak masalah, tapi kalau gangguan ini terjadi ketika sistem sedang update atau insert ke suatu database gimana jal ? bisa berabe dong.  Misal saja analoginya gini

Kita sedang berbelanja ke pasar, ceritanya kita beli odol, sampo dan sabun, nah pas di kasir nih kita udah di list pembeliannya, ketika pas diteken enter gitu, mendadak listrik mati, padahal nih data yang terkirim baru sampai data detail odol doang.  Nah data ini akan menjadi sesuatu yang janggal dong, dan kemungkinan besar akan merusak catatan transaksi.  Terus bagaimana penanggulanngannya ?

Yaitu dengan menggunakan Transaction Database.  Jadi prinsipnya, kek prinsip database yang pertama yaitu data masuk seutuhnya atau tidak sama sekali.  Nah kalau dengan Transaction Database tersebut, misal kasus diatas listrik mati, data yang sedang diproses itu tak bakal di commit (di eksekusi dan ditulis ) ke sebuah sistem manajemen basis data.

Oke, kalau udah paham langsung praktik saja ya, ceritanya bikin sebuah database dulu dengan dua table seperti dibawah ini

tblBarang

Namanya tblBarang, oh ya yang idDetailTransaksi dibuat autoincrement dan dibuat primary key, yang lain menyesuaikan

 trnPenjualan

Yang kedua, namanya trnPenjualan, kalau ini biasa semua, sesuaikan dan primary key nya adalah idTransaksi

Nah Kodenya sebagai berikut (berhubung lagi buka asp, jadi dalam mode asp bikinnya hehe ( cuman pake satu tombol doang ding buat ngetesnya :hammer: , maap ye kalo berantakan, kalo gak mudeng tanya aja ntar haha 😛 )

protected void btnTest_Click(object sender, EventArgs e)
        {
            SqlConnection koneksi = new SqlConnection("isi connection string sendiri");
            koneksi.Open();
            int id = getIdTransaksi();
            SqlTransaction Transaksi = koneksi.BeginTransaction("NamaTransaksi");
            try
            {
 
 
                //ceritanya dikasih dummy data aja ya
                string[] barang = new string[] { "Odol", "Sabun", "Sampo" };
                int[] Total = new int[] { 3500, 1600, 500 };
                int Jml = 0;
 
                for (int i = 0; i < 3; i++)
                {
                    //perintah buat ngisi yang detail barang
                    SqlCommand KomenSQL = new SqlCommand();
                    KomenSQL.Transaction = Transaksi;
                    KomenSQL.Connection = koneksi;
 
                    KomenSQL.CommandText = "INSERT INTO [dbo].[tblBarang] ([idBarang],[idTransaksi],[Total]) VALUES (@idBarang, @idTransaksi, @Total);";
                    KomenSQL.Parameters.AddWithValue("@idBarang", barang[i]);
                    KomenSQL.Parameters.AddWithValue("@idTransaksi", id);
                    KomenSQL.Parameters.AddWithValue("@Total", Total[i]);
                    KomenSQL.ExecuteNonQuery();
                    Jml = Jml + Total[i];
                }
 
                //perintah buat ngisi table yang total keseluruhan
                SqlCommand KomenSQL1 = new SqlCommand();
                KomenSQL1.Transaction = Transaksi;
                KomenSQL1.Connection = koneksi;
 
                KomenSQL1.CommandText = "INSERT INTO [dbo].[trnPenjualan] ([idTransaksi], [HargaTotal])  VALUES (@idTransaksi ,@HargaTotal);";
                KomenSQL1.Parameters.AddWithValue("@idTransaksi", id);
                KomenSQL1.Parameters.AddWithValue("@HargaTotal", Jml);
                KomenSQL1.ExecuteNonQuery();
 
                //nah setelah selesai tinggal deh di commit
                Transaksi.Commit();
 
 
            }
            catch (Exception ex)
            {
                //kalau gagal atau ada error tidak terduga, ex: time out, dll maka di rollback jadi gak ngaco databasenya
                Transaksi.Rollback();
            }
            //finally tutup koneksi
            koneksi.Close();
        }
        private int getIdTransaksi()
        {
            SqlConnection koneksi = new SqlConnection("isi connection string sendiri");
            koneksi.Open();
            DataTable dt = new DataTable();
            SqlCommand komen = koneksi.CreateCommand();
            komen.Connection = koneksi;
            komen.CommandText = "select max(idTransaksi) as id from trnPenjualan";
            SqlDataAdapter adapter = new SqlDataAdapter(komen);
            adapter.Fill(dt);
            koneksi.Close();
            if (dt.Rows.Count > 0)
            {
                try
                {
                    return int.Parse(dt.Rows[0]["id"].ToString().Trim()) + 1;
                }
                //kemungkinan akan error soalnya row nya isinya null
                catch (Exception ex)
                 {           
                 }
 
 
            }
            //kalau row nya isinya null, maka di balikin satu (buat inisialisasi)
            return 1;
 
        }

Disitu terlihat sebuah Transaction Database

Ceritanya semua Transaction Database diawali dengan begintransaction dan diakhiri dengan commit ataupun rollback.  Perintah commit akan dieksekusi ketika tidak ada sesuatu yang bermasalah, nah kalau rollback berarti telah terjadi sesuatu yang bermasalah.

Terus apa yang terjadi jika Transaction Database ini tidak diakhiri ? ya akhirnya menggantung, biasanya tergantung SQL Servernya sih, kalau beberapa waktu gak di akhiri dianggap time out terus rollback dah, atau mungkin malah jadi nge hung haha, ( belum pernah buktiin soalnya CMIIW) .

Sumber belajar : MSDN :p

One thought on “Contoh Transaction Database Microsoft SQL Server dalam C#

Leave a Comment