Sponsor

Best Patner

Senin, 11 April 2011

MySQL Transactional and Locking Statements

MySQL5.0 mendukung transaksi lokal dengan pernyataan seperti TRANSACTION START, SET AUTOCOMMIT, COMMIT dan ROLLBACK. Transaction berarti sekelompok SQL Konsolidasi yang menjalankan sebagai unit. Dan MySQL baik menjalankan semua pernyataan itu berhasil atau tidak mengeksekusi siapa pun. Hal ini dapat dicapai dengan melakukan rollback dan. Ketika semua laporan dijalankan dengan sukses maka anda dapat melakukan itu untuk efek database permanen. Tetapi jika kesalahan telah terjadi maka Anda dapat memutar kembali untuk pembatalan itu.

TRANSACTION START, COMMIT dan ROLLBACK

Sintaks umum BEGIN TRANSACTION, melakukan dan rollback adalah:

START TRANSACTION | BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET AUTOCOMMIT = {0 | 1}
START TRANSACTION dan BEGIN digunakan memulai transaksi baru. Dan COMMIT digunakan untuk melakukan (yang disimpan) transaksi berjalan berarti yang membuat perubahan permanen. ROLLBACK digunakan untuk mengulang kembali transaksi berjalan berarti membatalkan perubahan. SET AUTOCOMMIT pernyataan digunakan untuk menonaktifkan atau mengaktifkan default autocommit modus untuk transaksi berjalan.

Kata kunci opsional PEKERJAAN digunakan untuk mendukung untuk COMMIT dan ROLLBACK. Dan chain dan RELEASE digunakan untuk mengontrol tambahan atas penyelesaian transaksi. The And Chain klausa digunakan untuk memulai sebuah transaksi baru ketika arus satu berakhir. Dan ini baru memiliki tingkat isolasi yang sama. Klausa RELEASE digunakan untuk memutuskan hubungan server dengan koneksi klien saat setelah mengakhiri transaksi berjalan. Secara default MySQL dalam modus autocommit. Ketika kita menggunakan mesin transaksi penyimpanan yang aman seperti BDB, InnoDB maka kita dapat menonaktifkan modus autocommit dengan menggunakan pernyataan berikut:


mysql> SET AUTOCOMMIT=0;
Query OK, 0 rows affected (0.06 sec)

 Dengan menggunakan pernyataan di atas kita dapat menonaktifkan autocommit mode, maka kita harus menggunakan COMMIT untuk menyimpan perubahan dalam disk. Dan jika kita ingin mengabaikan perubahan maka kita bisa menggunakan ROLLBACK. Untuk menonaktifkan modus autocommit dengan serangkaian pernyataan tunggal maka kita bisa menggunakan pernyataan START TRANSACTION. Contoh:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE Emp SET Perks=Perks*1.03 WHERE Salary>15000;
Query OK, 4 rows affected (0.01 sec)
Rows matched: 4  Changed: 4  Warnings: 0
mysql> COMMIT;
Query OK, 0 rows affected (0.02 sec)

Pernyataan yang tidak dapat Rolled Kembali

Dalam MySQL beberapa pernyataan yang tersedia bahwa kita tidak dapat diperpanjang kembali ini termasuk DDL (Data Definition Language) pernyataan seperti membuat database, membuat tabel, drop database, tabel drop, mengubah tabel. Pastikan Anda transaksi tidak termasuk jenis ini laporan. Jika Anda telah mengeluarkan pernyataan DDL awal transaksi dan laporan lain gagal maka anda tidak dapat bergulir kembali efek penuh transaksi dengan menerbitkan pernyataan ROLLBACK.

SAVEPOINT dan ROLLBACK ATAS SAVEPOINT

Sintaks umum SAVEPOINT dan ROLLBACK TO SAVEPOINT adalah:
SAVEPOINT savepoint_name
ROLLBACK [KERJA] ATAS savepoint_name SAVEPOINT
RELEASE SAVEPOINT savepoint_name

SAVEPOINT pernyataan digunakan untuk menetapkan savepoint transaksi bernama dengan nama apapun. The ROLLBACK ATAS SAVEPOINT pernyataan digunakan untuk memutar kembali transaksi untuk savepoint bernama. Berarti modifikasi pada baris yang kami buat dalam transaksi berjalan setelah savepoint, kita modifikasi ini digulung kembali. Kita dapat menghapus savepoint bernama dari set savepoints transaksi saat ini dengan menggunakan SAVEPOINT RELEASE. Contoh:


mysql> SELECT * FROM Emp;
+-----+---------+----------+-------------------+--------+-------+
| Eid | Ename   | City     | Designation       | Salary | Perks |
+-----+---------+----------+-------------------+--------+-------+
| 1   | Rahul   | Delhi    | Manager           | 10300  | 879   |
| 2   | Gaurav  | Mumbai   | Assistant Manager | 10300  | 879   |
| 3   | Chandan | Banglore | Team Leader       | 15450  | 1060  |
| 5   | Tapan   | Pune     | Developer         | 20600  | 1178  |
| 6   | Amar    | Chennai  | Developer         | 16000  | 1193  |
| 7   | Santosh | Delhi    | Designer          | 10000  | 891   |
| 8   | Suman   | Pune     | Web Designer      | 20000  | 698   |
+-----+---------+----------+-------------------+--------+-------+
7 rows in set (0.46 sec)
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE Emp
    -> SET Salary=Salary*1.03 WHERE Salary>=10000;
Query OK, 7 rows affected (0.10 sec)
Rows matched: 7  Changed: 7  Warnings: 0
mysql> SAVEPOINT sve_point;
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO Emp VALUES(10,'Chandan','Delhi','Designer',20000,965);
Query OK, 1 row affected (0.03 sec)
mysql> ROLLBACK TO SAVEPOINT sve_point;
Query OK, 0 rows affected (0.04 sec)
mysql> INSERT INTO Emp VALUES(9,'Rajesh','Delhi','Developer',15000,965);
Query OK, 1 row affected (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.07 sec)
mysql> SELECT * FROM Emp;
+-----+---------+----------+-------------------+--------+-------+
| Eid | Ename   | City     | Designation       | Salary | Perks |
+-----+---------+----------+-------------------+--------+-------+
| 1   | Rahul   | Delhi    | Manager           | 10609  | 879   |
| 2   | Gaurav  | Mumbai   | Assistant Manager | 10609  | 879   |
| 3   | Chandan | Banglore | Team Leader       | 15914  | 1060  |
| 5   | Tapan   | Pune     | Developer         | 21218  | 1178  |
| 6   | Amar    | Chennai  | Developer         | 16480  | 1193  |
| 7   | Santosh | Delhi    | Designer          | 10300  | 891   |
| 8   | Suman   | Pune     | Web Designer      | 20600  | 698   |
| 9   | Rajesh  | Delhi    | Developer         | 15000  | 965   |
+-----+---------+----------+-------------------+--------+-------+
8 rows in set (0.02 sec)

LOCK TABLES dan UNLOCK TABLES
Sintaks umum untuk mengunci dan membuka tabel adalah:LOCK TABLES tbl_name [AS alias] {READ [LOKAL] | [LOW_PRIORITY] WRITE} [, tbl_name [AS] alias {BACA [LOKAL] | [LOW_PRIORITY] WRITE}] ... UNLOCK TABLES
 

Para LOCK TABLES digunakan untuk mengunci tabel dasar untuk thread ini. Jika ada thread lain mengunci tabel maka tabel ini diblokir sampai semua kunci dapat diperoleh. The UNLOCK TABLES digunakan untuk secara eksplisit melepaskan kunci yang dipegang oleh thread ini. Thread ini secara implisit membuka semua tabel jika isu-isu lain LOCK TABLES atau jika koneksi ke server ditutup. Setelah mendapatkan kunci global baca kita juga bisa menggunakan UNLOCK TABLE dengan FLUSH TABLES WITH READ LOCK untuk melepaskan kunci. Tetapi untuk menggunakan LOCK TABLES Anda memerlukan LOCK TABLES dan hak SELECT untuk tabel yang terlibat.
Sebuah mengunci tabel digunakan untuk melindungi hanya terhadap tidak pantas menulis atau dibaca oleh klien lain. Jika klien ada memegang kunci bahkan kunci membaca maka client dapat melakukan operasi tingkat tabel seperti DROP TABLE. Tapi operasi memotong tidak dapat dilakukan karena mereka tidak transaksi aman.
Penggunaan TABEL LOCK dengan tabel transaksional:

    
* Seperti yang kita diskusikan LOCK TABLES tidak transaksi aman dan secara implisit melakukan melakukan operasi pada setiap transaksi aktif sebelum melakukan untuk mengunci meja. Dan mulai melakukan transaksi secara implisit suatu TABEL UNLOCK.
    
* Untuk menggunakan LOCK TABLES dengan tabel transaksional seperti InnoDB, kita harus menetapkan AUTOCOMMIT = 0 dan kita tidak menyebutnya TABEL UNLOCK sampai kita komit transaksional secara eksplisit. Jika kita menelepon LOCK TABLES kemudian InnoDB internal membawanya kunci meja sendiri dan MySQL juga mengambil kunci tabel sendiri. Pada berikutnya melakukan InnoDB dirilis mengunci tabel tetapi untuk melepaskan MySQL kita harus memanggil UNLOCK TABLES. Namun jika kita AUTOCOMMIT = 1 maka InnoDB dirilis kunci meja segera setelah panggilan LOCK TABLES itu sebabnya kebuntuan dengan mudah dapat terjadi.
    
* ROLLBACK tidak dapat melepaskan MySQL non kunci tabel transaksional.
    
* FLUSH TABLES DENGAN READ LOCK digunakan untuk mendapatkan kunci global daripada kunci tabel.
Ketika kita menggunakan LOCK TABLES maka kita harus mengunci semua tabel yang kita gunakan dalam laporan kami. LOCK TABLES tidak bisa mengunci pandangan itulah sebabnya jika kita menggunakan tampilan apapun maka kita harus mengunci semua tabel dasar yang pandangan-pandangan ini tergantung. Ketika kita memperoleh kunci dengan pernyataan TABEL LOCK maka kita tidak bisa mengakses tabel yang tidak terkunci. Tetapi jika anda menggunakan alias dalam hal ini Anda harus mendapatkan kunci untuk masing-masing alias terpisah. Contoh:


mysql> LOCK TABLE Emp AS eealias WRITE;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO Emp VALUES(9,'Rajesh','Delhi','Developer',15000,965);
ERROR 1100 (HY000): Table 'Emp' was not locked with LOCK TABLES
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO Emp VALUES(9,'Rajesh','Delhi','Developer',15000,965);
Query OK, 1 row affected (0.04 sec)
mysql> LOCK TABLE Emp AS ee READ;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM Emp;
ERROR 1100 (HY000): Table 'Emp' was not locked with LOCK TABLES
mysql> SELECT * FROM Employee;
ERROR 1100 (HY000): Table 'Employee' was not locked with LOCK TABLES
mysql> SELECT * FROM Emp AS ee;
+-----+---------+----------+-------------------+--------+-------+
| Eid | Ename   | City     | Designation       | Salary | Perks |
+-----+---------+----------+-------------------+--------+-------+
| 1   | Rahul   | Delhi    | Manager           | 10927  | 879   |
| 2   | Gaurav  | Mumbai   | Assistant Manager | 10927  | 879   |
| 3   | Chandan | Banglore | Team Leader       | 16391  | 1060  |
| 5   | Tapan   | Pune     | Developer         | 21855  | 1178  |
| 6   | Amar    | Chennai  | Developer         | 16974  | 1193  |
| 7   | Santosh | Delhi    | Designer          | 10609  | 891   |
| 8   | Suman   | Pune     | Web Designer      | 21218  | 698   |
| 9   | Rajesh  | Delhi    | Developer         | 15000  | 965   |
+-----+---------+----------+-------------------+--------+-------+
8 rows in set (0.00 sec)

WRITE locks memiliki prioritas lebih tinggi untuk READ kunci itu berarti update diproses secepat mungkin. Berarti jika thread ada mendapatkan READ LOCK dan permintaan lain thread untuk kunci berikut READ WRITE maka permintaan kunci harus menunggu sampai thread WRITE telah merilis kunci. Untuk mendapatkan READ kunci ke benang lain kita dapat menggunakan LOW_PRIORITY TULIS kunci.

Penguncian Tabel adalah kebuntuan gratis. Anda harus berhati-hati jika Anda menggunakan sebuah LOW_PRIORITY MENULIS kunci, yang berarti hanya MySQL sedang menunggu kunci tertentu thi sampai ada benang yang tersedia yang ingin READ kunci. Setiap thread telah memperoleh ijin WRITE dan yang menunggu untuk mendapatkan kunci untuk tabel berikutnya dalam daftar tabel kunci maka semua thread lain harus menunggu untuk mengunci WRITE akan dirilis.

Jika kita ingin mengakhiri sebuah thread yang sedang menunggu untuk kunci tabel maka kita dapat menggunakan pernyataan KILL. Sintaks umum dari pernyataan KILL adalah:
         KILL [CONNECTION| QUERY] thread_id

Setiap koneksi untuk mysqld berjalan di thread terpisah. Dengan pernyataan processlist SHOW kita dapat melihat benang yang sedang berjalan dan kita dapat membunuh thread dengan pernyataan KILL. HUBUNGAN KILL sama seperti pernyataan KILL dengan modifier no. Hal ini digunakan untuk mengakhiri koneksi yang terkait dengan thread_id diberikan. KILL QUERY digunakan untuk menghentikan pernyataan bahwa koneksi yang sedang dijalankan tetapi meninggalkan koneksi itu sendiri utuh. Untuk mendapatkan daftar semua thread Anda membutuhkan hak istimewa PROSES dan untuk membunuh semua benang dan pernyataan maka Anda perlu hak istimewa SUPER lain Anda dapat melihat dan membunuh hanya benang Anda dan pernyataan. Contoh:

mysql> SHOW PROCESSLIST \G;
*************************** 1. row ***************************
     Id: 9
   User: root
   Host: localhost:1786
     db: employee
Command: Query
   Time: 0
  State: NULL
   Info: SHOW PROCESSLIST
1 row in set (0.00 sec)
mysql> KILL 9;
ERROR 2013 (HY000): Lost connection to MySQL server during query
   
Jika Anda menggunakan pernyataan INSERT DELAYED ke tabel apapun maka Anda tidak perlu untuk mengunci tabel yang karena di sini pernyataan INSERT dilakukan oleh thread terpisah.

SET TRANSACTION

Sintaks umum SET TRANSACTION adalah:
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }


SET TRANSACTION digunakan untuk mengatur tingkat transaksi isolasi untuk global atau sesi saat ini atau untuk transaksi berikutnya. Ketika kita menggunakan kata kunci GLOBAL maka menentukan tingkat standar transaksi global tetapi Anda membutuhkan hak istimewa SUPER untuk melakukan hal ini. Dan kata kunci SESI digunakan untuk mengatur tingkat standar transaksi untuk semua transaksi masa depan yang dilakukan pada koneksi saat ini.

     * Repeatable READ - Ini adalah tingkat isolasi default untuk tabel InnoDB. Dalam hal ini, semua membaca konsisten dalam transaksi.
     *
READ UNCOMMITTED - Hal ini digunakan, dimana dalam satu query transaksi dipengaruhi oleh perubahan yang tidak mengikat dalam transaksi lain.
     *
READ COMMITTED - Jika kita menggunakan pengaturan ini maka pembaruan komitmen yang terlihat dalam transaksi lain juga.
     * Serializable - Dalam pembaruan setelah tidak diperbolehkan dalam transaksi lain.

REPEATABLE READ Contoh:
Connection 1
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL
    -> REPEATABLE READ;
Query OK, 0 rows affected (0.00 sec)
mysql>  BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM Emp;
+-----+-------+-------+-------------+--------+-------+
| Eid | Ename | City  | Designation | Salary | Perks |
+-----+-------+-------+-------------+--------+-------+
| 1   | Rahul | Delhi | Manager     | 10927  | 879   |
+-----+-------+-------+-------------+--------+-------+
1 row in set (0.00 sec)
     
Connection 2
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO Emp VALUES(2,'Suman','Mumbai','Designer',20000,865);
Query OK, 1 row affected (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.02 sec)
mysql> SELECT * FROM Emp;
+-----+-------+--------+-------------+--------+-------+
| Eid | Ename | City   | Designation | Salary | Perks |
+-----+-------+--------+-------------+--------+-------+
| 1   | Rahul | Delhi  | Manager     | 10927  | 879   |
| 2   | Suman | Mumbai | Designer    | 20000  | 865   |
+-----+-------+--------+-------------+--------+-------+
2 rows in set (0.00 sec)
    
Connection 1
mysql> SELECT * FROM Emp;
+-----+-------+-------+-------------+--------+-------+
| Eid | Ename | City  | Designation | Salary | Perks |
+-----+-------+-------+-------------+--------+-------+
| 1   | Rahul | Delhi | Manager     | 10927  | 879   |
+-----+-------+-------+-------------+--------+-------+
1 row in set (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM Emp;
+-----+-------+--------+-------------+--------+-------+
| Eid | Ename | City   | Designation | Salary | Perks |
+-----+-------+--------+-------------+--------+-------+
| 1   | Rahul | Delhi  | Manager     | 10927  | 879   |
| 2   | Suman | Mumbai | Designer    | 20000  | 865   |
+-----+-------+--------+-------------+--------+-------+
2 rows in set (0.01 sec)
READ UNCOMMITTED Example :
Connection 1
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL
    -> READ UNCOMMITTED;
Query OK, 0 rows affected (0.00 sec)
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO Emp VALUES(3,'Chandan','Delhi','G Manager',30000,999);
Query OK, 1 row affected (0.00 sec)
      
Connection 2mysql> SELECT * FROM Emp;
+-----+-------+--------+-------------+--------+-------+
| Eid | Ename | City   | Designation | Salary | Perks |
+-----+-------+--------+-------------+--------+-------+
| 1   | Rahul | Delhi  | Manager     | 10927  | 879   |
| 2   | Suman | Mumbai | Designer    | 20000  | 865   |
+-----+-------+--------+-------------+--------+-------+
2 rows in set (0.01 sec)
    
Connection 1
mysql> ROLLBACK;
Query OK, 0 rows affected (0.08 sec)
    
Connection 2
mysql> SELECT * FROM Emp;
+-----+-------+--------+-------------+--------+-------+
| Eid | Ename | City   | Designation | Salary | Perks |
+-----+-------+--------+-------------+--------+-------+
| 1   | Rahul | Delhi  | Manager     | 10927  | 879   |
| 2   | Suman | Mumbai | Designer    | 20000  | 865   |
+-----+-------+--------+-------------+--------+-------+
2 rows in set (0.01 sec)
READ COMMITTED Example :
Connection 1
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL
    -> READ COMMITTED;
Query OK, 0 rows affected (0.00 sec)
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
    
Connection 2
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO Emp VALUES(3,'Chandan','Delhi','G Manager',25000,986);
Query OK, 1 row affected (0.00 sec)
    
Connection 1
mysql> SELECT * FROM Emp;
+-----+-------+--------+-------------+--------+-------+
| Eid | Ename | City   | Designation | Salary | Perks |
+-----+-------+--------+-------------+--------+-------+
| 1   | Rahul | Delhi  | Manager     | 10927  | 879   |
| 2   | Suman | Mumbai | Designer    | 20000  | 865   |
+-----+-------+--------+-------------+--------+-------+
2 rows in set (0.00 sec)
       
Connection 2
mysql> COMMIT;
Query OK, 0 rows affected (0.03 sec)
    
Connection 1
mysql> SELECT * FROM Emp;
+-----+---------+--------+-------------+--------+-------+
| Eid | Ename   | City   | Designation | Salary | Perks |
+-----+---------+--------+-------------+--------+-------+
| 1   | Rahul   | Delhi  | Manager     | 10927  | 879   |
| 2   | Suman   | Mumbai | Designer    | 20000  | 865   |
| 3   | Chandan | Delhi  | G Manager   | 25000  | 986   |
+-----+---------+--------+-------------+--------+-------+
3 rows in set (0.00 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
SERIALIZABLE Example :
Connection 1
mysql> SET TRANSACTION ISOLATION LEVEL
    -> SERIALIZABLE;
Query OK, 0 rows affected (0.00 sec)
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM Emp;
+-----+---------+--------+-------------+--------+-------+
| Eid | Ename   | City   | Designation | Salary | Perks |
+-----+---------+--------+-------------+--------+-------+
| 1   | Rahul   | Delhi  | Manager     | 10927  | 879   |
| 2   | Suman   | Mumbai | Designer    | 20000  | 865   |
| 3   | Chandan | Delhi  | G Manager   | 25000  | 986   |
+-----+---------+--------+-------------+--------+-------+
3 rows in set (0.00 sec)
    
Connection 2
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE Emp SET Salary=Salary*1.03;

Pada koneksi pertama kita mengeksekusi statemen SELECT bahwa sebabnya UPDATE terkunci.    
       
Connection 1mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
     
Connection 2
Query OK, 3 rows affected (9.12 sec)
Rows matched: 3  Changed: 3  Warnings: 0
mysql> COMMIT;
Query OK, 0 rows affected (0.02 sec)
mysql> SELECT * FROM Emp;
+-----+---------+--------+-------------+--------+-------+
| Eid | Ename   | City   | Designation | Salary | Perks |
+-----+---------+--------+-------------+--------+-------+
| 1   | Rahul   | Delhi  | Manager     | 11255  | 879   |
| 2   | Suman   | Mumbai | Designer    | 20600  | 865   |
| 3   | Chandan | Delhi  | G Manager   | 25750  | 986   |
+-----+---------+--------+-------------+--------+-------+
3 rows in set (0.00 sec)
  

sumber : http://www.roseindia.net/mysql/mysql5/mysql-transactional-and-locking.shtml 

2 komentar:

aku gak maksud dengan apa yang anda ajarkan,, tolong berikan contoh agar bisa lebih mudah di mengerti,, aku tunggu yaaa,.,.,.

iya pak, mohon diberikan contoh

Posting Komentar