2010-01-25 13 views
5

PLATFORM MY:PHP & mySQL: Mã đơn giản để thực hiện giao dịch - Commit & Rollback

PHP & mySQL

TÌNH CỦA TÔI:

Tôi cố gắng để thực hiện các giao dịch trong mã của tôi . Tôi đã cố gắng làm theo các ví dụ, nhưng nó không giúp được gì nhiều. Tôi đang chạy 3 truy vấn và tôi muốn viết một giao dịch theo cách sao cho nếu có bất kỳ truy vấn nào bị lỗi, toàn bộ giao dịch sẽ quay trở lại. Tôi thực sự đánh giá cao một mã PHP theo định hướng không đối tượng đơn giản, hiệu quả và không phải đối tượng để đạt được mục tiêu này. Cảm ơn bạn trước.

PHP MY Mã sản phẩm:

//db_res calls a custom function that performs a mysql_query on the query 
$res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3"); 
$res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10"); 
$res3 = db_res("DELETE FROM t3 WHERE c1 = 20"); 

if($res1 && $res2 && $res3) 
{ 
//commit --- but how? 
} 
else 
{ 
//rollback --- but how? 
} 
+1

câu trả lời đơn giản và ĐÁNH GIÁ/ví dụ (try catch) đã được đưa ra cho cùng một câu hỏi tại http://stackoverflow.com/questions/2708237/php-mysql-transactions-examples phải đọc, hiển thị CHÍNH XÁC phải làm gì trong và các điều khoản đơn giản. –

+0

Kiểm tra http://dev.mysql.com/doc/refman/5.0/en/commit.html này. Điều này sẽ hướng dẫn bạn đi đúng hướng. –

Trả lời

6

Bạn cần phải sử dụng mysqli extension để sử dụng chức năng này.

Xem: autocommit(), commit(), và rollback()

<?php 
$link = mysqli_connect("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

/* disable autocommit */ 
mysqli_autocommit($link, FALSE); 

mysqli_query($link, "CREATE TABLE myCity LIKE City"); 
mysqli_query($link, "ALTER TABLE myCity Type=InnoDB"); 
mysqli_query($link, "INSERT INTO myCity SELECT * FROM City LIMIT 50"); 

/* commit insert */ 
mysqli_commit($link); 

/* delete all rows */ 
mysqli_query($link, "DELETE FROM myCity"); 

if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) { 
    $row = mysqli_fetch_row($result); 
    printf("%d rows in table myCity.\n", $row[0]); 
    /* Free result */ 
    mysqli_free_result($result); 
} 

/* Rollback */ 
mysqli_rollback($link); 

if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) { 
    $row = mysqli_fetch_row($result); 
    printf("%d rows in table myCity (after rollback).\n", $row[0]); 
    /* Free result */ 
    mysqli_free_result($result); 
} 

/* Drop table myCity */ 
mysqli_query($link, "DROP TABLE myCity"); 

mysqli_close($link); 
?> 
+0

@John Cảm ơn bạn đã trả lời. Tôi đã xây dựng hơn 85% ứng dụng của mình bằng cách sử dụng mysql_query. Tôi nghĩ rằng tôi sẽ cần phải sửa đổi ứng dụng của tôi và làm lại nó từ đầu nếu tôi phải sử dụng mysqli. Có thể theo bất kỳ cách nào, để làm điều đó bằng cách sử dụng mysql_query? Tôi không quá chắc chắn rằng tôi có thể chuyển sang mysqli tại thời điểm này, do đó, một giải pháp thay thế được đánh giá cao. Mong nhận được câu trả lời của bạn. – Devner

+2

Thật không may là không. các hàm mysql_ * không cung cấp quyền truy cập vào các tính năng nâng cao được cung cấp bởi MySQL 4 trở lên như các giao dịch và các thủ tục được lưu trữ. Bạn không cần phải quay trở lại và thay đổi mọi cuộc gọi đến MySQL để sử dụng mysqli. Chỉ cần thay đổi các trang mà thực sự sẽ cần sử dụng nó. –

+0

Tôi sẽ thử điều đó. Cảm ơn bạn. – Devner

13

Bạn không cần phải sử dụng mysqli. Bạn chỉ có thể phát hành lệnh giao dịch dưới dạng truy vấn.

Vì vậy, ví dụ bạn:

mysql_query("start transaction;"); 

//db_res calls a custom function that performs a mysql_query on the query 
$res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3"); 
$res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10"); 
$res3 = db_res("DELETE FROM t3 WHERE c1 = 20"); 

if($res1 && $res2 && $res3) 
{ 
    mysql_query("commit;"); 
} 
else 
{ 
    mysql_query("rollback;"); 
} 

Bởi họ cách nếu bạn đang nghĩ về việc nâng cấp để MySQLi, xin vui lòng không. Nâng cấp lên PDO thay vào đó, nó sane hơn nhiều.

+0

Tôi nghĩ rằng bạn có nghĩa là mysql_query ("bắt đầu giao dịch"); hoặc mysql_query ("bắt đầu"); – Rooster242

+0

Vâng, đã trộn lẫn giữa hai ... Sẽ sửa chữa. – rjmunro

+0

mysql không an toàn, hãy thử sử dụng mysqli hoặc PDO – Asuquo12