Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menangani Transaksi Di MySQL

MySQL menyediakan berbagai mesin database untuk menangani query SQL. Mesin yang paling populer adalah MyISAM dan InnoDB. Dari dua mesin ini, InnoDB mendukung transaksi yang berarti kita dapat melakukan dan melakukan rollback untuk melakukan operasi yang melibatkan banyak kueri sebagai satu unit. Hal yang sama tidak mungkin dilakukan dengan MyISAM karena tidak mendukung transaksi. InnoDB lebih andal dibandingkan dengan MyISAM karena menggunakan log transaksional untuk pemulihan otomatis.

Catatan :MySQL berencana untuk menghapus MyISAM sepenuhnya karena kinerja InnoDB jauh lebih baik dibandingkan dengan MyISAM.

Tutorial ini memberikan detail untuk menangani transaksi di MySQL menggunakan START TRANSACTION, COMMIT , dan ROLLBACK pernyataan. Meskipun kita dapat menjalankan kueri SQL secara terpisah yang merupakan skenario ideal, dalam beberapa kasus kita perlu memastikan bahwa semua kueri khusus untuk suatu tugas harus berhasil atau gagal karena kegagalan salah satu kueri. Kita dapat menganggap tugas seperti itu sebagai satu unit yang melibatkan banyak operasi atau kueri untuk membuat, memperbarui, atau menghapus baris. Oleh karena itu, dalam unit transaksional yang memiliki banyak operasi, ia harus berhasil atau gagal.

Seseorang harus berhati-hati saat menangani transaksi karena ada pernyataan tertentu yang tidak dapat dibatalkan. Ini termasuk database CREATE/DROP, tabel CREATE/ALTER/DROP atau rutinitas yang tersimpan.

Sifat Transaksi

Di bawah ini tercantum empat properti standar transaksi. Ini juga disebut sebagai ASAM .

Atomitas - Ini memastikan bahwa semua operasi yang terlibat dalam tugas atau unit diselesaikan dengan sukses. Jika salah satu operasi gagal, transaksi harus dibatalkan dan semua operasi sebelumnya harus dikembalikan ke keadaan semula. Artinya, jika terjadi kegagalan transaksi, tidak ada operasi yang terlibat di dalamnya yang harus berhasil.

Konsistensi - Data harus dalam keadaan konsisten pada awal dan akhir transaksi untuk memastikan bahwa basis data berubah status untuk mencerminkan perubahan pada transaksi yang berhasil dilakukan.

Isolasi - Transaksi harus diselesaikan secara terpisah dengan menyembunyikan status perantara dengan transaksi lain. Setiap transaksi harus beroperasi secara independen dan transparan satu sama lain.

Daya Tahan - Ini memastikan bahwa perubahan data sebagai bagian dari transaksi tetap ada bahkan jika terjadi kegagalan sistem. Perubahan tidak boleh dibatalkan bahkan jika terjadi kegagalan sistem.

Laporan Transaksi

MULAI TRANSAKSI - Kita bisa menggunakan MULAI TRANSAKSI atau MULAI atau MULAI BEKERJA untuk memulai transaksi. MULAI atau MULAI BEKERJA adalah alias dari MULAI TRANSAKSI.

BERKOMITMEN - Jika berhasil, COMMIT perintah harus dikeluarkan pada akhir transaksi untuk mempertahankan perubahan.

ROLLBACK - Jika terjadi kegagalan, ROLLBACK perintah harus dikeluarkan untuk memulihkan status seolah-olah sebelum memulai transaksi.

SETEL KOMIT OTOMATIS - Gunakan pernyataan SET AUTOCOMMIT untuk menonaktifkan komit otomatis di awal transaksi dan mengaktifkannya di akhir transaksi. Gunakan hanya jika MULAI TRANSAKSI atau MULAI atau MULAI BEKERJA tidak digunakan untuk menangani transaksi.

Contoh Transfer Uang

Saya akan menjelaskan transaksi menggunakan contoh transfer uang intra-bank di mana sejumlah uang harus ditransfer dari satu rekening ke rekening lain dalam bank yang sama.

Catatan :Contoh ini hanya untuk tujuan demonstrasi dan skenario sebenarnya pasti akan berbeda berdasarkan aturan perbankan. Ini juga mengasumsikan bahwa kueri transaksional ditangani secara terprogram dan nilai antara disimpan dalam variabel yang sesuai.

Urutan operasi untuk melakukan transfer adalah sebagai berikut:

  • Dapatkan id pelanggan debit dan kredit dari permintaan dan simpan dalam variabel.
  • Dapatkan jumlah yang akan ditransfer dari permintaan dan simpan dalam variabel.
  • Mulai transaksi.
  • Dapatkan saldo pelanggan pertama dan simpan dalam variabel.
  • Dapatkan saldo pelanggan kedua dan simpan dalam variabel.
  • Batalkan transaksi jika saldo pelanggan pertama tidak mencukupi.
  • Tambahkan transaksi debit untuk mencerminkan pengurangan dari rekening pelanggan pertama.
  • Kembalikan jika terjadi kegagalan.
  • Tambahkan transaksi kredit untuk mencerminkan transfer ke rekening pelanggan kedua.
  • Kembalikan jika terjadi kegagalan.
  • Rekam transfer.
  • Kembalikan jika terjadi kegagalan.
  • Perbarui saldo pelanggan pertama.
  • Kembalikan jika terjadi kegagalan.
  • Perbarui saldo pelanggan kedua.
  • Kembalikan jika terjadi kegagalan.
  • Melakukan transaksi.

Di bawah ini adalah contoh kueri untuk mengeksekusi urutan transfer.

-- Start the transaction
START TRANSACTION;

-- Get balance of first customer
SELECT balance from ACCOUNT WHERE customer_id = 123124123;

-- Get balance of second customer
SELECT balance from ACCOUNT WHERE customer_id = 223124145;

-- Rollback in case of insufficient funds
ROLLBACK;

-- Add debit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(123124123, <amount>, 0, <reference>);

-- Rollback in case of failure
ROLLBACK;

-- Add credit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(223124145, <amount>, 1, <reference>);

-- Rollback in case of failure
ROLLBACK;

-- Add transfer transaction
INSERT INTO transfer(from,to,amount) VALUES(123124123, 223124145, <amount>);

-- Rollback in case of failure
ROLLBACK;

-- Update balance of first customer
UPDATE ACCOUNT SET balance = <balance - amount> WHERE customer_id = 123124123;

-- Rollback in case of failure
ROLLBACK;

-- Update balance of second customer
UPDATE ACCOUNT SET balance = <balance + amount> WHERE customer_id = 223124145;

-- Rollback in case of failure
ROLLBACK;

-- Commit the transaction
COMMIT;

Kami dapat dengan jelas melihat bahwa kami harus melakukan rollback jika terjadi kegagalan pada tahap apa pun untuk kembali ke status awal sebelum memulai transfer untuk mencerminkan saldo sebenarnya dari kedua pelanggan.

Beginilah cara kami menangani transaksi di MySQL.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL -- Menggabungkan Antar Basis Data Pada Server Berbeda Menggunakan Python?

  2. Posting dan dapatkan secara bersamaan di php

  3. Cara Mencadangkan Basis Data Terenkripsi dengan Server Percona untuk MySQL 8.0

  4. Skrip Bash untuk memasukkan nilai di MySQL

  5. Format variabel MySQL untuk daftar nilai NOT IN