2011-12-20 40 views
5

Làm cách nào để khóa bảng mysql bằng php? Tôi hiện đang có mã này:Cách khóa bảng mysql trong php

$db->query("LOCK TABLES tbl_othercharge WRITE"); 
for($x=0;$x<=500; $x++){ 
    $id = get_max(); 
    $db->query("INSERT INTO tbl_othercharge SET tblocID = '$id', assessmentID='lock1'"); 
} 

$db->query("UNLOCK TABLES"); 

Đây là hàm get_max(), rõ ràng sẽ thất bại nếu tập lệnh ở trên thực hiện đồng thời.

<?php 
    function get_max(){ 
     global $db; 
     $max = $db->get_var("SELECT MAX(tblocNumber) FROM tbl_othercharge"); 
     if($max == null){ 
      $max = 1; 
     }else if($max >= 1){ 
      $max = $max + 1; 
     } 
     return 'OC'.$max; 
    } 
    ?> 

Tôi đang cố gắng kiểm tra xem có vấn đề đồng thời hay không bằng cách thực thi cùng một tập lệnh trên 2 trình duyệt. Đoạn mã trên chèn hơn 400 bản ghi thay vì 999 bản ghi. Làm thế nào để tôi khóa bàn đúng cách trong khi tôi đang chèn thứ gì đó vào đó.

Tôi muốn khóa bàn để ngăn chặn một cái gì đó như thế này xảy ra: enter image description here

Như bạn có thể thấy lĩnh vực với tiền tố 'OC' trên nó nên có một số tương đương với các tính năng tự động tăng khóa chính.

+0

Và tại sao bạn muốn khóa bàn? –

+0

Còn công cụ lưu trữ và giao dịch InnoDB thì sao? – CodeZombie

+0

@EugenRieck: vui lòng xem bản sửa đổi của tôi –

Trả lời

4

Giải pháp đáng tin cậy duy nhất là thực hiện chèn bằng giá trị giả, nhận id chèn cuối cùng và cập nhật hàng thành giá trị chính xác.

mysql_query("INSERT INTO table (field) VALUES (dummy);"); 
$id = mysql_last_insert_id(); 
mysql_query("UPDATE table SET field='OC{$id}' WHERE id={$id} LIMIT 1;"); 
2

Bạn đã thử:

for($x=0;$x<=500; $x++){ 
    $db->query("LOCK TABLES tbl_othercharge WRITE"); 
    $id = get_max(); 
    $db->query("INSERT INTO tbl_othercharge SET tblocID = '$id', assessmentID='lock1'"); 
    $db->query("UNLOCK TABLES"); 
} 

Bằng cách này, bạn sẽ thiết lập khóa mỗi khi bạn chèn một hàng!

3

Tôi muốn đề xuất trường 'OC' từ bảng, ví dụ:

CREATE TABLE tbl_othercharge (tblocID int AUTO_INCREMENT PRIMARY KEY, assessmentID varchar(100)); 

CREATE VIEW vw_othercharge SELECT tblocID, concat('OC',tblocID) as OCnumber, assessmentID FROM tbl_othercharge 

bây giờ trực tiếp tất cả các lệnh liên quan đến vw_othercharge và quên nó đi.

Các vấn đề liên quan