2015-11-25 13 views
14

Trong SQL Server chúng tôi có thể viết bên dưới SQL Queries để lấy dữ liệu Chưa cam kết trong cơ sở dữ liệu. Điều này có nghĩa là dữ liệu vẫn còn trong giao dịch và Giao dịch chưa hoàn tất.Lấy dữ liệu không được bổ sung trong MySQL

SQL Server Query

Select * from TableName With(NoLock); 

Có bất kỳ tương đương trong cơ sở dữ liệu MySQL để có được dữ liệu ngay cả khi bảng bị khóa? Tôi đang thử tính năng này trong PHP CodeIgnitor

+0

Cần mẫu mã trong các hình thức của PHP và MySQL cho sự tương tác cơ sở dữ liệu – Pankaj

+0

thấy điều này có thể giúp http: // stackoverflow.com/questions/917640/any-way-to-select-without-gây-lock-in-mysql – Linus

Trả lời

1

Chỉ công cụ lưu trữ InnoDB hỗ trợ đầy đủ các giao dịch. Nó cũng triển khai thực hiện MVCC kiểu Oracle/PostgreSQL để ngăn chặn các khóa hàng ngầm ẩn khỏi các lần đọc. Để có được Read-Uncommitted trong InnoDB, hãy phát hành SET TRANSACTION LEVEL READ UNCOMMITTED trước khi phát hành truy vấn.

Cú pháp để làm như vậy trong PHP sẽ giống như thế này:

$dbh->exec('SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'); 
$dbh->beginTransaction(); 

này thiết lập mức độ cách ly cho đến khi tới COMMIT hoặc ROLLBACK. Để thay đổi cấp độ tồn tại trong khoảng thời gian của phiên, hãy sử dụng

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

để thay thế.

Để ghi đè khóa đọc không chia sẻ trên bàn hoặc hàng, tôi không chắc chắn điều đó là có thể, cũng như tôi không thể nghĩ ra một tình huống mong muốn. Khóa không chia sẻ thường không chia sẻ vì một lý do.

+1

Cần mã mẫu dưới dạng PHP và MySQL để tương tác cơ sở dữ liệu – Pankaj

+0

MyISAM không có nhận thức về giao dịch. Không có 'cam kết'. Toàn bộ bảng bị khóa cho đến khi truy vấn kết thúc, vì vậy không có cách nào để xem dữ liệu 'không được cam kết'. –

1

Câu lệnh SELECT được thực hiện theo cách không khóa, nhưng có thể sử dụng phiên bản trước đó của hàng. Do đó, bằng cách sử dụng mức cô lập này, các lần đọc như vậy không nhất quán. Điều này cũng được gọi là đọc bẩn. Nếu không, mức cô lập này hoạt động như READ COMMITTED.

SERIALIZABLE

mức này cũng giống như đọc lặp lại, nhưng InnoDB ngầm chuyển đổi tất cả đồng bằng tuyên bố SELECT để SELECT ... KHÓA TRÊN SHARE THỨC nếu autocommit bị vô hiệu hóa. Nếu bật tự động, thì SELECT là giao dịch riêng của nó. Do đó, nó được biết là chỉ đọc và có thể được tuần tự hóa nếu được thực hiện như một đọc không nhất quán (nonlocking) và không cần chặn cho các giao dịch khác. (Để buộc một đồng bằng CHỌN để chặn nếu các giao dịch khác đã sửa đổi các hàng được lựa chọn, vô hiệu hóa autocommit.)

autocommit

Command-Line Format --autocommit[=#] 
System Variable Name autocommit 
Variable Scope Global, Session 
Dynamic Variable Yes 
Permitted Values Type boolean 
Default ON 

Chế độ autocommit. Nếu được đặt thành 1, tất cả các thay đổi đối với bảng sẽ có hiệu lực ngay lập tức. Nếu được đặt thành 0, bạn phải sử dụng COMMIT để chấp nhận giao dịch hoặc ROLLBACK để hủy giao dịch đó. Nếu autocommit là 0 và bạn thay đổi nó thành 1, MySQL thực hiện một COMMIT tự động của bất kỳ giao dịch mở nào. Một cách khác để bắt đầu một giao dịch là sử dụng câu lệnh START TRANSACTION hoặc BEGIN. Xem Section 13.3.1, “START TRANSACTION, COMMIT, and ROLLBACK Syntax”.

Theo mặc định, kết nối máy khách bắt đầu bằng tự động được đặt thành 1. Để khiến khách hàng bắt đầu với giá trị mặc định là 0, hãy đặt giá trị tự động toàn cục bằng cách khởi động máy chủ bằng tùy chọn --autocommit = 0.Để thiết lập các biến sử dụng một tập tin tùy chọn, bao gồm những dòng này:

[mysqld] 
autocommit=0 

See This also

+0

Cần mã mẫu dưới dạng PHP và MySQL để tương tác với cơ sở dữ liệu – Pankaj

+0

Tôi nghĩ bất kỳ thứ gì bạn chọn với php của bạn sẽ không được chấp nhận trừ khi bạn cam kết. –

4
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 
SELECT * FROM TABLE_NAME ; 
COMMIT ; 

Reference

1

Trong Code Igniter, bạn có thể sử dụng lệnh sau đây trước khi bất kỳ yêu cầu:

$this->db->simple_query("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"); 

Bạn có thể tìm hiểu thêm thông tin về MySQL isolation level in the documentation. Điều này đòi hỏi các bảng innoDB.

Để biết thêm thông tin về simple_query(), theo codeigniter documentation, nó được sử dụng khi truy vấn không trả về kết quả.

+0

Cần mã mẫu dưới dạng PHP và MySQL để tương tác cơ sở dữ liệu – Pankaj

+0

@Helper Đó là PHP và MySQL. Nếu vấn đề của bạn không liên quan đến codeigniter, bạn phải sử dụng 'mysqli_query()' thay vì '$ this-> db-> simple_query()'. – Adam

9

Tìm thấy một bài viết với tiêu đề "cú pháp MySQL NOLOCK"

http://itecsoftware.com/with-nolock-table-hint-equivalent-for-mysql

SQL Server VỚI (NOLOCK) trông như thế này:

SELECT * FROM TABLE_NAME WITH (nolock) 

Để đạt được cùng với MySQL, chúng tôi thay đổi chế độ cách ly phiên bằng cách sử dụng lệnh SET SESSION.

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 
SELECT * FROM TABLE_NAME ; 
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ; 

Bạn có thể đạt được cùng bởi dưới đây cũng:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 
SELECT * FROM TABLE_NAME ; 
COMMIT ; 

Tuyên bố này sẽ làm việc tương tự như VỚI (NOLOCK) tức là READ UNCOMMITTED dữ liệu. Chúng tôi cũng có thể thiết lập mức độ cách ly cho tất cả các kết nối toàn cầu:

SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 

Bên cạnh đó, hai biến hệ thống liên quan đến cách ly cũng mức độ tồn tại trong máy chủ MySQL:

SELECT @@global.tx_isolation; (global isolation level) 
SELECT @@tx_isolation; (session isolation level) 

Hoặc thiết lập mức độ cô lập bên trong một giao dịch :

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 
GO 

Trong trình kích hoạt mã, bạn có thể bọc truy vấn bằng hai giải pháp đầu tiên hoặc bạn có thể sử dụng tùy chọn chung.

để bạn tham khảo bạn có thể sử dụng mã dưới đây:

$this->db->query("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE"); 
$this->db->trans_start(); 

// your code 

$this->db->trans_complete(); 

Cập nhật 1:

Bạn chỉ có thể thiết lập mức độ cô lập trong một truy vấn trước khi bạn chạy các câu lệnh của bạn. Dưới đây là đơn giản mã php mysqli tu sử dụng isolation level read uncommited

//db connection 
$mysqli = new mysqli('localhost', 'user', 'pass', 'db'); 

//set isolation level 
$mysqli->query("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"); 

//your Select Query 
$results = $mysqli->query("SELECT * FROM tablename"); 


while($row = $results->fetch_assoc()) { 
    //some statements 
} 

// Frees the memory associated with a result 
$results->free(); 
$mysqli->query("COMMIT"); 
// close connection 
$mysqli->close(); 
+0

Cần mã mẫu dưới dạng PHP và MySQL để tương tác cơ sở dữ liệu – Pankaj

+0

@Helper xem mã php mẫu cho cùng một –

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