Phục hồi mysqli không hoạt động

Trong thực tế, có rất nhiều trường hợp mà bạn phải thay đổi dữ liệu trong một hoặc nhiều bảng cơ sở dữ liệu. Trong một số vấn đề dữ liệu không thể thống nhất khi thực thi lệnh riêng lẻ. Nếu câu lệnh đầu tiên được thực hiện theo một cách chính xác nhưng các câu lệnh tiếp theo thất bại thì dữ liệu có thể ở trạng thái không chính xác

Có rất nhiều trường hợp mà bạn cần phải thay đổi dữ liệu trong một hoặc nhiều bảng cơ sở dữ liệu. Trong một số vấn đề dữ liệu không thể thống nhất khi thực thi lệnh riêng lẻ. Nếu câu lệnh đầu tiên được thực hiện theo một cách chính xác nhưng các câu lệnh tiếp theo thất bại thì dữ liệu có thể ở trạng thái không chính xác

Một ví dụ điển hình là chức năng chuyển đổi số dư tài khoản của một hệ thống ngân hàng. Một giao dịch chuyển có thể yêu cầu 2 câu lệnh

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
0 và
    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
1. Đầu tiên phải tăng số dư của tài khoản đích sau đó làm giảm số dư của tài khoản thứ hai. Cuối cùng sẽ thêm 1 hàng mới vào trong bảng chuyển giao để cung cấp ký tự nhật ký cho công việc giao dịch này

Nếu việc tăng số dư thực hiện chính xác nhưng việc thứ 2 và thứ 3 không thành công thì số dư của 1 tài khoản sẽ tăng lên nhưng các nguồn tài khoản sẽ không thay đổi và sẽ không có nhật ký để ghi lại vấn đề này

Trong trường hợp giải quyết như vậy, chúng ta cần một cách để đảm bảo rằng tất cả các lệnh liên quan đều thực hiện chính xác trước khi thay đổi cơ sở dữ liệu. Chúng ta cũng cần có thể đảo ngược tất cả các lệnh thực thi nếu một thay đổi không thành công. Điều này đạt được bằng cách sử dụng các giao dịch [transaction]

Giao dịch là một nhóm các câu lệnh SQL có thứ tự các hoạt động thao tác trên cơ sở dữ liệu nhưng được xem như một đơn vị thao tác duy nhất và chúng chỉ có thể cùng thành công hoặc cùng thất bại

Một giao dịch không được xem là thành công khi chỉ cần một thao tác đơn giản bất kỳ trong đó không hoàn thành. Trường hợp này được xem là fail

Các giao dịch được bắt đầu trước khi dữ liệu thay đổi và cam kết một khi tất cả các bản cập nhật or liên quan được thực hiện thành công. Cho đến khi giao dịch được cam kết, những thay đổi không được lưu trữ trong cơ sở dữ liệu. Ở bất kỳ thời điểm nào trong giao dịch, bạn có thể

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
2 [thao tác quay ngược cơ sở dữ liệu về một trạng thái cũ. ] to end transaction

Trong các ứng dụng truy cập cơ sở dữ liệu, nhiều người dùng có thể đồng thời xem và chỉnh sửa dữ liệu. Các thao tác đồng thời có thể dẫn đến dữ liệu không thống nhất và chính xác. Bên cạnh đảm bảo hoạt động không đúng của một tập hợp các câu lệnh SQL, một giao dịch cần đảm bảo người dùng khác không thể sửa chữa các dòng liên quan đến giao dịch

2. Thuộc tính của giao dịch

Một giao dịch có 4 thuộc tính then chốt [không thể thiếu] được viết tắt là ACID

Atomicity [Tính nguyên tố]

Bảo đảm tất cả các hành động trong một đơn vị giao dịch là thành công hoàn toàn. Ngược lại giao dịch sẽ bị dừng ngay tại thời điểm bị lỗi

Tất nhiên các hoạt động trước đó trong giao dịch sẽ quay lại đúng trạng thái cũ của nó. Việc chuyển tiền không hạn chế có thể thành công hay yếu tố vì nhiều lý do nhưng tính nguyên tố đảm bảo rằng một tài khoản sẽ không bị trừ tiền nếu như tài khoản kia không được cộng số tiền tương ứng

Consistency[Tính nhất quán]

Cơ sở dữ liệu bảo đảm đã được thay đổi đúng trạng thái sau khi giao dịch thành công và không xảy ra lỗi

Isolation[ Tính cô lập] Bảo đảm giao dịch này hoạt động độc lập so với giao dịch khác

Durability[Chữ bền]

Kết quả bảo đảm hoặc tác động của giao dịch vẫn luôn tồn tại, kể cả khi hệ thống xảy ra lỗi

3. Khi nào thì sử dụng Giao dịch

Giao dịch được sử dụng khi xử lý các vấn đề liên quan đến việc truy xuất dữ liệu đồng thời để đảm bảo tính toàn vẹn của dữ liệu khi xảy ra sự thay đổi [các hành động như

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
3…]

Khi một giao dịch bao gồm nhiều lệnh cập nhật, nó đảm bảo tất cả các bản cập nhật đều được thực hiện thành công hoặc trong trường hợp lệnh gặp sự cố toàn bộ giao dịch bị hủy bỏ. Khi đó dữ liệu trở về trạng thái như trước khi xảy ra giao dịch

Nói cách khác giao dịch Ngăn chặn sự cố dữ liệu được cập nhật giữa chừng, trong đó một phần được cập nhật còn một phần bị bỏ qua

4. Cô lập level [isolation level] giữa các giao dịch

Các giao dịch có thể đồng thời truy cập vào dữ liệu chia sẻ. . Tùy thuộc vào mức độ cô lập giữa các giao dịch để có thể xuất hiện các biểu tượng

Dirty reads Xảy ra khi một giao dịch được phép đọc dữ liệu từ một dòng đang được sửa chữa bởi một giao dịch khác chưa được cam kết

đọc không lặp lại

There can be going to out with the following fields

1 Giao dịch A đọc 1 bảng

2 Sau đó giao dịch Bupdate bảng đó

3 Sau đó giao dịch BUpdate bảng đó

4 Giao dịch A đọc lại bảng sau khi giao dịch B Cập nhật

5 Giao dịch Một dữ liệu được tìm thấy không giống như ban đầu

Phantom đọc

Xảy ra khi trong một giao dịch , hai câu truy vấn giống nhau khi thi hành trả về tập hợp các dòng khác nhau. Điều này xảy ra khi tại thời điểm giữa hai câu truy vấn đó, giao dịch thứ hai được bổ sung vào các dòng dữ liệu mới đáp ứng số mệnh đề

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
4 của câu truy vấn

5. Thao tác giao dịch cơ bản trong MySQL

1 Create a transaction

  START TRANSACTION;
  BEGIN;

There can be done many command

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
5 after
    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
6;

2 End of transaction

________số 8
  1. Lệnh CAM KẾT lưu các thay đổi vào cơ sở dữ liệu
  2. Lệnh ROLLBACK hủy bỏ các thay đổi đang thực hiện trong giao dịch và cơ sở dữ liệu được phục hồi về trạng thái trước khi giao dịch

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
7 định nghĩa một điểm đánh dấu trong một giao dịch

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
8 TO
    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
7 cho phép phục hồi trước điểm đánh dấu

6. Ứng dụng giao dịch trong Laravel

Tôi có một ví dụ như sau

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];

Ta đi tạo một tài khoản và một người dùng. Việc tạo người dùng phụ thuộc vào việc tạo tài khoản thành công hay không ?

Nhìn vào ví dụ này, chúng ta có thể thấy vấn đề đó có thể xảy ra với các trường hợp như sau

a. Tài khoản không được tạo

Nếu tài khoản không được tạo ra, không có ID để tạo người dùng. Trong trường hợp này, tài khoản và người dùng sẽ không được tạo ra

b. Người dùng không được tạo

Tuy nhiên, nếu tài khoản [Acount] đã được tạo ra, thì Người dùng cũng không được tạo trong trường hợp này

Transactional of them ta

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
3

Giao dịch cơ bản trong Laravel. First, to run a transaction with Laravel. Ta sử dụng lệnh như bên dưới

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
4

phương pháp. Là phương thức, bên trong đó là các thao tác, làm việc với cơ sở dữ liệu

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
5

Làm thế nào để biết mã được khôi phục hoặc cam kết trong giao dịch?

You can follow this đoạn code

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
6

Rất đơn giản, nếu một ngoại lệ của bất kỳ loại nào được ném trong công việc đóng cửa, sau đó giao dịch được cuộn lại. Điều này có nghĩa là nếu có lỗi SQL, sau đó giao dịch sẽ bị khôi phục. mạnh mẽ hơn, tuy nhiên, điều này có nghĩa là chúng tôi có thể đẩy ngoại lệ của riêng chúng tôi để khôi phục một giao dịch

Nó giống như thế này

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
7

Giao dịch nâng cao trong Laravel

Gần đây tôi thấy mình cần kiểm soát nhiều hơn đối với việc xử lý giao dịch. Các phương thức tạo [] của tôi cũng xử lý xác thực bằng cách ném một ValidationException tùy chỉnh nếu có vấn đề về xác thực. Nếu ngoại lệ này bị phát hiện, máy chủ sẽ phản hồi bằng cách chuyển hướng người dùng bằng thông báo lỗi

Hiện tại, tôi đang cần kiểm soát hoặc xử lý một giao dịch, Phương thức

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
30 của tôi cũng được xử lý bởi
    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
31. Một tùy chỉnh của
    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
32, nếu những xác thực này có vấn đề. Máy chủ sẽ trả về thông báo lỗi trong đó có thông báo lỗi

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
1

Làm thế nào để có thể đặt một giao dịch nếu ValidationExceptions luôn luôn bắt. Các bạn có thể xem ví dụ này

    // Create Account
    $newAcct = Account::create[[
        'accountname' => Input::get['accountname'],
    ]];

    // Create User
    $newUser = User::create[[
        'username' => Input::get['username'],
        'account_id' => $newAcct->id,
    ]];
2

Kết luận

Ở bài viết này, tôi đã giới thiệu cho các bạn về giao dịch trong cơ sở dữ liệu. Vì sao phải sử dụng giao dịch. Nhưng ứng dụng nào nên sử dụng giao dịch [Ví dụ như hệ thống ngân hàng]

Qua đó, tô đã hướng dẫn các bạn cách sử dụng giao dịch trong Laravel. Một framework đình đám nhất của PHP hiện nay

Chủ Đề