Bài viết đầu tiên: Sử dụng Row Version trong SQL Server

Hôm nay được mấy teammate trong dự án chỉ giúp, mình mới biết thế nào là blog. Tạo xong My Blog rồi mà không thử viết 1 bài thì cũng thật là quê mùa. Bài viết đầu tiên cũng nói về 1 thứ đã cũ rồi (nó cũng khá quê mùa) nên mong các bạn góp ý.

Sử dụng Row Version để điều khiển optimistic trong SQL Server

Trong thao tác với DB, để đảm bảo tính concurrency, có 2 phương pháp: optimistic và permistic.

– Phương pháp Permistic điển hình là việc lock row ngay sau khi lấy dữ liệu để user edit rồi update. Sau khi update thành công sẽ giải phóng lock trên row vừa update. Dự án hiện tại có sử dụng 1 bảng lock tương ứng với bảng thao tác, ví dụ: Table A có table ALock tương ứng.

– Có nhiều phương pháp optimistic, trong đó sử dụng row-version là phương pháp khá hay. SQLServer có cung cấp 1 kiểu dữ liệu là Timestamp. Timestamp trong SQLServer không tuân theo chuẩn SQL-92 (đáng ra là kiểu DateTime) mà lại dùng cho mục đích làm row-version. Mỗi table trong SQLServer chỉ có thể có tối đa 1 trường TimeStamp. Mỗi khi 1 row trong DB được insert hoặc update, Timestamp của DB sẽ thay đổi (tăng lên 1 đơn vị) và cập nhật vào trường Timestamp của row đó. Để lấy giá trị Timestamp của DB, sử dụng câu query:

SELECT @@DBTS

Chú ý: Giá trị @@DBTS không phải giá trị current datetime như function Current_Timestamp() trả về

Việc sử dụng trường timestamp để quản lý optimistic concurrency là rất có lợi. Ví dụ, câu lệnh update sau sẽ đảm bảo tính tương tranh:

UPDATE PRODUCT_ROWVERSION SET [NAME]=‘Cơm hộp’

where id=‘1’ AND version=0x00000000000007D3

với giá trị 0x00000000000007D3 là giá trị timestamp của row. Như vậy, process nào update sau sẽ không thể update được và đảm bảo tính tương tranh.

Do Timestamp data type có thể thay đổi mục đích sử dụng trong tương lai nên khi viết lệnh DDL, hãy cố gắng thay thế kiểu Timestamp bằng RowVersion datatype. RowVersion synonyms là 1 trong các Data Type Synonyms được thêm vào SQL Server 2005 nhằm mục đích tương thích với SQL-92.

Trong Oracle, TIMESTAMP tương thích với SQL-92 nên TIMESTAMP là kiểu DateTime, và để áp dụng phương pháp tương tự trên, ta có thể sử dụng Trigger để update row version cho bảng.

 

Bài viết đầu tiên, và cũng do mới đọc 1 cuốn sách mới download được trên mạng về nên đem ra thử test và post lên. Mọi người góp ý dùm nhé.

meGnedloG
Nguyen Minh Dung

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


%d bloggers like this: