Cách khóa Laravel bi quan với các ví dụ

Khóa bi quan là một kỹ thuật được sử dụng để ngăn nhiều người dùng cập nhật cùng một dữ liệu cùng một lúc. Trong Laravel, khóa bi quan có thể đạt được bằng cách sử dụng phương thức `lockForUpdate` trên phiên bản trình tạo truy vấn. Đây là một ví dụ

// 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']);

Phương thức `lockForUpdate` sẽ khóa bản ghi với ID là 1, để những người dùng khác không thể cập nhật nó cho đến khi người dùng hiện tại cập nhật xong bản ghi

Hãy nhớ rằng việc sử dụng khóa bi quan có thể gây ra các vấn đề về hiệu suất nếu không được sử dụng cẩn thận, vì nó có thể dẫn đến nhiều bản ghi bị khóa và có khả năng dẫn đến bế tắc. Thay vào đó, nên sử dụng khóa lạc quan, trong đó các bản ghi chỉ bị khóa khi phát hiện xung đột. Bạn có thể tìm hiểu thêm về khóa tối ưu trong tài liệu Laravel

Với bài viết này, Chúng tôi sẽ giải đáp vấn đề mà nhiều bạn quan tâm khi viết chương trình Ví dụ về cách khóa Laravel theo kiểu bi quan .

Cách khóa Laravel bi quan với các ví dụ
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;
  }
}

Còn rất nhiều ví dụ xoay quanh chủ đề How to Pessimistic Locking Laravel with Examples vui lòng xem thêm

Laravel có hỗ trợ giao dịch cơ sở dữ liệu và khóa bi quan không?

Giao dịch cơ sở dữ liệu và khóa bi quan có lẽ không phải là tính năng được sử dụng nhiều nhất, tuy nhiên, chúng có thể cực kỳ hữu ích. Hãy cùng xem qua và sau đó kiểm tra xem lớp cơ sở dữ liệu của Laravel hỗ trợ các tính năng này như thế nào. Trong bài đăng này, chúng tôi không tập trung vào việc triển khai SQL đơn giản của các giao dịch cơ sở dữ liệu hoặc khóa

Khóa bi quan trong SQL là gì?

Chúng tôi có thể sử dụng khóa bi quan để đảm bảo rằng không có giao dịch nào khác có thể sửa đổi hoặc xóa dữ liệu dành riêng. Có hai loại khóa chúng ta có thể giữ lại. một khóa độc quyền và một khóa chung. Chúng tôi có thể đọc nhưng không ghi dữ liệu khi người khác giữ khóa chung. Để sửa đổi hoặc xóa dữ liệu dành riêng, chúng tôi cần có khóa độc quyền

Valet có hỗ trợ khóa lạc quan trong Laravel không?

² Điều phối viên của Laravel đã từ chối đề xuất hỗ trợ khóa lạc quan. Tuy nhiên, nó có thể được hỗ trợ bằng thư viện của bên thứ ba. ³ Valet sử dụng Nginx và php-fpm và những thứ khác để chạy ứng dụng Laravel. ⁴ Chúng tôi đã sử dụng một nhóm chỉ 10 tài khoản để tạo điều kiện cho cuộc đua dễ xảy ra hơn

Bế tắc trong Laravel là gì?

Laravel có phần tài liệu riêng về các bế tắc, nhưng thật khó để hiểu nó làm gì, vì vậy chúng tôi có ví dụ về ngân hàng tuyệt vời này. Khóa "để cập nhật" ngăn các bản ghi đã chọn bị sửa đổi hoặc không được chọn bằng một khóa dùng chung khác. Đây là những gì chúng ta muốn

Làm cách nào chúng ta có thể thực hiện khóa bi quan trong Entity Framework?

Chúng tôi có thể thực hiện khóa bi quan bằng cách chỉ định "IsolationLevel" trong các thủ tục được lưu trữ của SQL Server, ADO. NET hoặc bằng cách sử dụng đối tượng phạm vi giao dịch .

Làm cách nào để ngừng khóa bi quan?

Tránh khóa bi quan nếu bạn có thể. Tránh khóa nhiều hàng mỗi phiên nếu bạn có thể. Tránh khóa các hàng theo thứ tự ngẫu nhiên nếu bạn có thể. Tránh đi làm để xem những gì đã xảy ra.

Làm cách nào để tránh các sự cố tương tranh trong laravel?

Bạn có thể giải quyết vấn đề này bằng cách sử dụng công việc/hàng đợi . Bằng cách đó, không có 'giao dịch' nào liên quan đến người dùng sẽ chạy 'cùng lúc' với người khác.

Bạn có thể giải thích khóa bi quan trong Entity Framework không?

Đồng thời bi quan (Khóa) . 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.