thắc mắc Cần giúp đỡ về IsolationLevel

kyle92

Junior Member
Mình đang viết 1 cái api sử dụng MS SQL, hiện tại đang để IsolationLevel là ReadCommitted. Nếu giao dịch ít thì không sao, nhưng nếu có nhiều request cùng một lúc thì performance bị giảm rất nhiều, sau khi mày mò tìm nguyên nhân thì có vẻ như nếu để IsolationLevel là Snapshot thì sẽ giải quyết được tình trạng. Về IsolationLevel mình chưa hiểu sâu lắm, vozer nào biết thì có thể chỉ bảo thêm cho mình với :(
 

zulu

Member
Ko dùng pool nghĩa là cứ có request là open connection rồi xử lý xong đóng connection hả? Nếu đúng z thì ko tạch mới lạ
Mình không dùng pool bạn ơi, hiện mình xử dụng entity framework core

via nextVOZ for iPhone
 

ThuyMy

Member
Mình đang viết 1 cái api sử dụng MS SQL, hiện tại đang để IsolationLevel là ReadCommitted. Nếu giao dịch ít thì không sao, nhưng nếu có nhiều request cùng một lúc thì performance bị giảm rất nhiều, sau khi mày mò tìm nguyên nhân thì có vẻ như nếu để IsolationLevel là Snapshot thì sẽ giải quyết được tình trạng. Về IsolationLevel mình chưa hiểu sâu lắm, vozer nào biết thì có thể chỉ bảo thêm cho mình với :(
Ai chỉ bạn vậy như vậy, snapshot có thể tạm hiểu đơn giãn là các trans sẽ xử lý tuần tự. Chèn Snapshot vào nó càng chậm hơn chứ giải quyết cái gì 😐
 

kyle92

Junior Member
nhiều của bác là bn rồi, api xử lý gì, có phức tạp k bác
Tầm vài chục request 1 s, đọc dữ liệu có, ghi lữ diệu có, chủ yếu là xử lý đơn hàng check tồn kho, có những request thời gian xử lý lên tầm vài chục s :(
 

kyle92

Junior Member
Ai chỉ bạn vậy như vậy, snapshot có thể tạm hiểu đơn giãn là các trans sẽ xử lý tuần tự. Chèn Snapshot vào nó càng chậm hơn chứ giải quyết cái gì 😐
Mình tự mày mò thôi bạn, mình tham khảo ở đây
. Theo như video này thì dùng snapshot sẽ không lock resource và từ đó có thể xử lý nhiều transaction 1 lúc hơn.
 

noneedname

Junior Member
MS SQL k rõ nhưng theo mình hiểu thì level càng cao -> performance càng giảm. Mà Snapshot > read commited thì theo lý thuyết phải giảm perf chứ nhỉ :D
 

heinz

Đã tốn tiền
bác có bị deadlock k? bác đã thử tạo 1 vài index chưa

xử lý lên đến vài chục giây thì em nghĩ rất dễ rơi vào trường hợp là thao tác read quá lâu dẫn đến insert/update/delete phải chờ

Ai chỉ bạn vậy như vậy, snapshot có thể tạm hiểu đơn giãn là các trans sẽ xử lý tuần tự. Chèn Snapshot vào nó càng chậm hơn chứ giải quyết cái gì 😐
theo mình hiểu snapshot là sql server nó sẽ "snapshot" data vào tempdb và đọc từ đấy, nên k lock data
cái snapshot của bác hơi khác thì phải
 

ez-aqua

Member
Mình sẽ giải thích về khía cạnh SQL thuần, còn nếu là do tầng application hoặc kết nối thì mình ko đảm bảo.

Read commited là gì?

Là khi bạn read 1 row thì bạn sẽ issue 1 lock S trên row hoặc page. Lập tức thả sau khi đọc xong.

Transactions that are running at the READ COMMITTED level do issue shared locks, but the row or page locks are released after the row is read
Nếu đang có transaction đang giữ write lock (X), với READ COMMITTED bạn sẽ phải đứng chờ cho lock X được nhả thì mới có thể read được dòng.

Exclusive (X) locks prevent access to a resource by concurrent transactions. With an exclusive (X) lock, no other transactions can modify data; read operations can take place only with the use of the NOLOCK hint or read uncommitted isolation level.
Với Isolation snapshot, khi bạn đụng read, bạn sẽ vô tempdb lấy ra version commit gần nhất của row đó và đọc.

The snapshot isolation level uses row versioning to provide transaction-level read consistency. Read operations acquire no page or row locks; only SCH-S table locks are acquired. When reading rows modified by another transaction, they retrieve the version of the row that existed when the transaction started
https://docs.microsoft.com/en-us/sq...nd-row-versioning-guide?view=sql-server-ver15


Khả năng là bạn vừa đọc vừa update nhiều, lại giữ transaction lâu, hoặc là 1 bạn insert delete gì nhiều đó khiến nó escalate lock lên cao hơn. Mà read nếu ko có snapshot thì sẽ phải đứng chờ transaction khác nhả lock X rồi mới đọc được.

Với Azure SQL server mặc định tạo xong nó sẽ set up cho bạn cái option tự động override các transaction với readcommitted thành snapshot. READ_COMMITTED_SNAPSHOT ở Azure SQL Server mặc định là ON. Hồi xưa mình test isolation cứ thắc mắc tại sao behavior ở con database local khác hẳn với con ở Azure, sau mới biết là do cái option này.

If you set the READ_COMMITTED_SNAPSHOT database option to ON, the database engine uses row versioning and snapshot isolation as the default, instead of using locks to protect the data.
 
Top