以下示例使用两个到 SQL Anywhere 示例数据库的连接,说明如何使用快照隔离无阻塞地维护一致性。
运行以下命令,创建一个到 SQL Anywhere 示例数据库的 Interactive SQL 连接 (Connection1):
dbisql -c "DSN=SQL Anywhere 12 Demo;ConnectionName=Connection1" |
运行以下命令,创建一个到 SQL Anywhere 示例数据库的 Interactive SQL 连接 (Connection2):
dbisql -c "DSN=SQL Anywhere 12 Demo;ConnectionName=Connection2" |
在 Connection1 中,执行以下语句将隔离级别设置为 1(读取已提交的),该隔离级别在当前行上获取并保持读锁定。
SET OPTION isolation_level = 1; |
在 Connection1 中,执行以下语句:
SELECT * FROM Products; |
ID | Name | Description | Size | Color | Quantity | ... |
---|---|---|---|---|---|---|
300 | Tee Shirt | Tank Top | Small | White | 28 | ... |
301 | Tee Shirt | V-neck | Medium | Orange | 54 | ... |
302 | Tee Shirt | Crew Neck | One size fits all | Black | 75 | ... |
400 | Baseball Cap | Cotton Cap | One size fits all | Black | 112 | ... |
... | ... | ... | ... | ... | ... | ... |
在 Connection2 中,执行以下语句:
UPDATE Products SET Name = 'New Tee Shirt' WHERE ID = 302; |
在 Connection1 中,再次执行 SELECT 语句:
SELECT * FROM Products; |
该 SELECT 语句被阻塞且无法继续执行,因为 Connection2 中的 UPDATE 语句未提交或回退。必须等到 Connection2 中的事务完成后,SELECT 语句才能继续执行。这确保了 SELECT 语句不会将未提交的数据读入其结果中。
在 Connection2 中,执行以下语句:
ROLLBACK; |
Connection2 中的事务完成,Connection1 中的 SELECT 语句继续执行。
使用语句快照隔离级别可以获得与隔离级别 1 相同的并发,但不造成阻塞。
在 Connection1 中,执行以下语句允许快照隔离:
SET OPTION PUBLIC.allow_snapshot_isolation = 'On'; |
在 Connection 1 中,执行以下语句将隔离级别更改为语句快照:
SET TEMPORARY OPTION isolation_level = 'statement-snapshot'; |
在 Connection1 中,执行以下语句:
SELECT * FROM Products; |
在 Connection2 中,执行以下语句:
UPDATE Products SET Name = 'New Tee Shirt' WHERE ID = 302; |
在 Connection1 中,再次执行 SELECT 语句:
SELECT * FROM Products; |
SELECT 语句执行且不被阻塞,但不包括来自 Connection2 执行的 UPDATE 语句的数据。
在 Connection2 中,通过执行以下语句完成事务:
COMMIT; |
在 Connection1 中,完成事务(对 Products 表的查询),然后再次执行 SELECT 语句,以查看更新后的数据:
COMMIT; SELECT * FROM Products; |
ID | Name | Description | Size | Color | Quantity | ... |
---|---|---|---|---|---|---|
300 | Tee Shirt | Tank Top | Small | White | 28 | ... |
301 | Tee Shirt | V-neck | Medium | Orange | 54 | ... |
302 | New Tee Shirt | Crew Neck | One size fits all | Black | 75 | ... |
400 | Baseball Cap | Cotton Cap | One size fits all | Black | 112 | ... |
... | ... | ... | ... | ... | ... | ... |
通过执行以下语句,撤销对 SQL Anywhere 示例数据库所做的更改:
UPDATE Products SET Name = 'Tee Shirt' WHERE id = 302; COMMIT; |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |