Cara Pesimis Mengunci Laravel dengan Contohnya

Pesimis penguncian adalah teknik yang digunakan untuk mencegah beberapa pengguna memperbarui data yang sama pada waktu yang sama. Di Laravel, penguncian pesimis dapat dicapai dengan menggunakan metode `lockForUpdate` pada instance pembuat kueri. Ini sebuah contoh

// Retrieve a record from the database and lock it for update
$user = DB::table('users')->where('id', 1)->lockForUpdate()->first();

// Update the record DB::table('users')->where('id', 1)->update(['name' => 'John']);

Metode `lockForUpdate` akan mengunci record dengan ID 1, sehingga pengguna lain tidak dapat memperbaruinya hingga pengguna saat ini selesai memperbarui record

Perlu diingat bahwa menggunakan penguncian pesimistis dapat menyebabkan masalah kinerja jika tidak digunakan dengan hati-hati, karena dapat mengakibatkan banyak rekaman terkunci dan berpotensi menyebabkan kebuntuan. Sebaiknya gunakan penguncian optimis sebagai gantinya, di mana rekaman hanya dikunci saat konflik terdeteksi. Anda dapat mempelajari lebih lanjut tentang penguncian optimis dalam dokumentasi Laravel

Dengan artikel ini, Kami akan menjawab masalah yang banyak Anda khawatirkan saat menulis program Cara Pesimis Mengunci Laravel dengan Contoh .

Cara Pesimis Mengunci Laravel dengan Contohnya
<?php

function transfer($fromAccountId, $toAccountId, $amount)
{
  DB::beginTransaction();

  try {
    $fromQuery = Account::whereId($fromAccountId);
    if (! $fromQuery->exists()) {
      throw new InvalidAccountException();
    }

    $toQuery = Account::whereId($toAccountId);
    if (! $toQuery->exists()) {
      throw new InvalidAccountException();
    }

    $fromAccount = $fromQuery->lockForUpdate()->first();
    if ($amount > $fromAccount->balance) {
      throw new InsufficientBalanceException();
    }

    $toAccount = $toQuery->lockForUpdate()->first();
    $toAccount->balance += $amount;
    $toAccount->save();

    $fromAccount->balance -= $amount;
    $fromAccount->save();

    $transaction = new Transaction();
    $transaction->from_account_id = $fromAccountId;
    $transaction->to_account_id   = $toAccountId;
    $transaction->amount          = $amount;
    $transaction->save();

    DB::commit();
  } catch (\Exception $e) {
    DB::rollBack();
    throw $e;
  }
}

Masih banyak lagi contoh seputar topik Cara Pesimis Locking Laravel dengan Contoh silahkan lihat selengkapnya

Apakah Laravel mendukung transaksi basis data dan penguncian pesimistis?

Transaksi basis data dan penguncian pesimis mungkin bukan fitur yang paling banyak digunakan, namun bisa sangat berguna. Mari kita lihat sekilas lalu periksa bagaimana layer database Laravel mendukung fitur-fitur ini. Dalam posting ini, kami tidak fokus pada implementasi SQL biasa dari transaksi atau penguncian basis data

Apa itu kunci pesimis dalam SQL?

Kita dapat menggunakan kunci pesimistis untuk memastikan bahwa tidak ada transaksi lain yang dapat mengubah atau menghapus data yang dicadangkan. Ada dua jenis kunci yang bisa kita pertahankan. kunci eksklusif dan kunci bersama. Kami dapat membaca tetapi tidak dapat menulis data saat orang lain memegang kunci bersama. Untuk mengubah atau menghapus data yang dicadangkan, kita perlu memiliki kunci eksklusif

Apakah valet mendukung kunci optimis di Laravel?

² Koordinator Laravel telah menolak proposal untuk dukungan kunci optimis. Namun, itu dapat didukung menggunakan perpustakaan pihak ketiga. ³ Valet menggunakan Nginx dan php-fpm dan lainnya untuk menjalankan aplikasi Laravel. ⁴ Kami telah menggunakan satu set yang hanya terdiri dari 10 akun untuk membuat kondisi balapan lebih mungkin terjadi

Apa itu kebuntuan di Laravel?

Laravel memiliki bagian dokumentasinya sendiri tentang kebuntuan, tetapi sulit untuk mencerna mana yang melakukan apa, jadi kami memiliki contoh perbankan yang luar biasa ini. Kunci "untuk pembaruan" mencegah rekaman yang dipilih diubah atau dipilih dengan kunci bersama lainnya. ini yang kita inginkan

Bagaimana kita bisa melakukan penguncian pesimistis di Entity Framework?

Kita dapat melakukan penguncian pesimistis dengan menetapkan "IsolationLevel" dalam prosedur tersimpan SQL Server, ADO. NET, atau dengan menggunakan objek cakupan transaksi .

Bagaimana cara menghentikan penguncian pesimistis?

Hindari penguncian pesimis jika Anda bisa. Hindari mengunci lebih dari satu baris per sesi jika Anda bisa. Hindari mengunci baris dalam urutan acak jika Anda bisa. Hindari pergi bekerja untuk melihat apa yang terjadi.

Bagaimana kita bisa menghindari masalah konkurensi di laravel?

Anda dapat menyelesaikan ini dengan menggunakan pekerjaan/antrean . Dengan begitu tidak ada 'transaksi' yang terkait dengan pengguna yang akan berjalan 'pada waktu yang sama' dengan yang lain.

Bisakah Anda menjelaskan penguncian pesimistis di Entity Framework?

Konkurensi Pesimistis (Mengunci) . If you lock a row for update access, no other users are allowed to lock the row either for read-only or update access, because they would get a copy of data that's in the process of being changed.