Ngoài thói quen tôi đã sử dụng các khối try/catch trong mã ứng dụng của mình cho tất cả các truy vấn SQL, với một rollback ở đầu khối catch. Tôi cũng đã cam kết những người thành công. Điều này có cần thiết cho SELECT
s không? Nó có giải phóng thứ gì đó ở phía cơ sở dữ liệu không? Các câu lệnh chọn không thay đổi bất kỳ dữ liệu nào, do đó có vẻ hơi vô nghĩa, nhưng có lẽ có một số lý do mà tôi không biết.Tôi có nên rollback không thành công câu lệnh SELECT hoặc cam kết thành công?
ví dụ:
try {
$results = oci_execute($statement)
oci_commit($connection);
return $results;
}
catch {
oci_rollback($connection)
throw new SqlException("failed");
}
@Quassnoi: Vâng, có thể. Nếu một con trỏ mở ra, con trỏ sẽ giữ lùi lại (UNDO) cho mọi giao dịch đang hoạt động khi con trỏ được mở. Vì vậy, nếu một là mở bất kỳ recordsets, một trong những không cần phải đóng chúng khi thực hiện để giúp DBA nghèo tránh những sợ hãi ORA-01555. Trong một số hệ thống cơ sở dữ liệu (tôi đang xem bạn, DB2), bạn cần phải cam kết sau khi chọn để loại bỏ khóa đọc. Đó có lẽ là nơi chuẩn mã hóa phát triển từ, hoặc chỉ là hoang tưởng thẳng. –
@Adam paranoia trong trường hợp của tôi –
@Adam: 'UNDO' được tạo bởi các giao dịch khác, không phải là giao dịch giữ con trỏ (chúng tôi giả định nó chỉ đọc). Các giao dịch khác có thể thay đổi dữ liệu, sửa đổi các trang dữ liệu (trong trường hợp đó 'UNDO' sẽ được tạo và giữ cho đến khi kết thúc giao dịch) và cam kết (trong trường hợp đó' UNDO' được phát hành và đánh dấu là tự do viết lại). Trong con trỏ chỉ đọc, 'ORA-01555' chỉ có thể được tạo nếu dữ liệu được yêu cầu bởi con trỏ bị ghi đè bởi giao dịch đồng thời được cam kết. Một lần nữa, chính con trỏ sẽ không khóa dữ liệu, tạo ra bất kỳ 'UNDO' hoặc thậm chí khóa 'UNDO' mà nó cần. – Quassnoi