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

MySQL:Transaksi vs Mengunci Tabel

Mengunci tabel mencegah pengguna DB lain memengaruhi baris/tabel yang Anda kunci. Tetapi kunci, dengan sendirinya, TIDAK akan memastikan bahwa logika Anda keluar dalam keadaan yang konsisten.

Pikirkan sistem perbankan. Saat Anda membayar tagihan secara online, setidaknya ada dua akun yang terpengaruh oleh transaksi:Akun Anda, dari mana uang itu diambil. Dan rekening penerima, ke mana uang itu ditransfer. Dan rekening bank, di mana mereka akan dengan senang hati menyetor semua biaya layanan yang dibebankan pada transaksi tersebut. Mengingat (seperti yang diketahui semua orang akhir-akhir ini) bahwa bank sangat bodoh, katakanlah sistem mereka bekerja seperti ini:

$balance = "GET BALANCE FROM your ACCOUNT";
if ($balance < $amount_being_paid) {
    charge_huge_overdraft_fees();
}
$balance = $balance - $amount_being paid;
UPDATE your ACCOUNT SET BALANCE = $balance;

$balance = "GET BALANCE FROM receiver ACCOUNT"
charge_insane_transaction_fee();
$balance = $balance + $amount_being_paid
UPDATE receiver ACCOUNT SET BALANCE = $balance

Sekarang, tanpa penguncian dan tanpa transaksi, sistem ini rentan terhadap berbagai kondisi balapan, yang terbesar adalah pembayaran berganda yang dilakukan di akun Anda, atau akun penerima secara paralel. Sementara kode Anda telah mengambil saldo Anda dan melakukan large_overdraft_fees() dan yang lainnya, sangat mungkin bahwa beberapa pembayaran lain akan menjalankan jenis kode yang sama secara paralel. Mereka akan mengambil kembali saldo Anda (misalnya, $100), melakukan transaksi mereka (mengeluarkan $20 yang Anda bayar, dan $30 yang mereka tipu), dan sekarang kedua jalur kode memiliki dua saldo yang berbeda:$80 dan $70. Bergantung pada saldo mana yang berakhir terakhir, Anda akan mendapatkan salah satu dari dua saldo tersebut di akun Anda, bukan $50 yang seharusnya Anda dapatkan ($100 - $20 - $30). Dalam hal ini, "kesalahan bank menguntungkan Anda".

Sekarang, katakanlah Anda menggunakan kunci. Pembayaran tagihan Anda ($20) mencapai pipa pertama, sehingga menang dan mengunci catatan akun Anda. Sekarang Anda memiliki penggunaan eksklusif, dan dapat mengurangi $20 dari saldo, dan menulis kembali saldo baru dengan tenang... dan akun Anda berakhir dengan $80 seperti yang diharapkan. Tapi... uhoh... Anda mencoba untuk memperbarui rekening penerima, dan akun itu terkunci, dan terkunci lebih lama dari kode yang diizinkan, waktu transaksi Anda habis... Kita berurusan dengan bank bodoh, jadi alih-alih mengalami kesalahan yang semestinya penanganan, kode hanya menarik exit() , dan $20 Anda lenyap menjadi embusan elektron. Sekarang Anda kehabisan $20, dan Anda masih berhutang $20 kepada penerima, dan telepon Anda diambil alih.

Jadi... masukkan transaksi. Anda memulai transaksi, Anda mendebit akun Anda $20, Anda mencoba mengkredit penerima dengan $20... dan sesuatu meledak lagi. Tapi kali ini, alih-alih exit() , kode hanya dapat melakukan rollback , dan poof, $20 Anda secara ajaib ditambahkan kembali ke akun Anda.

Pada akhirnya, intinya begini:

Kunci mencegah orang lain mengganggu catatan basis data apa pun yang Anda hadapi. Transaksi menjaga kesalahan "nanti" agar tidak mengganggu hal-hal "sebelumnya" yang telah Anda lakukan. Tidak ada satu pun yang dapat menjamin bahwa semuanya berjalan baik-baik saja pada akhirnya. Tapi bersama-sama, mereka melakukannya.

dalam pelajaran besok:Kegembiraan Kebuntuan.



  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 Ubah Kata Sandi Pengguna

  2. Cara Menghitung Pengguna Aktif Bulanan (MAU) di MySQL

  3. MySQL – Operator Perbandingan TERKECIL dan TERBESAR

  4. Tidak Dapat Membuat Model Data Entitas - menggunakan MySql dan EF6

  5. Di mana mengubah nilai lower_case_table_names=2 di windows xampp