1

我正在使用 Sybase SQL Anywhere 12。假设我有一个 Table 用户,与它有以下连接:

conn_name   conn_id user_id table_type  creator table_name  index_id    lock_class  lock_duration   lock_type   row_identifier
SQL_DBC_a2a1060 3193    DBA BASE        DBA     user        (NULL)      Row         Transaction     WriteNoPK   37431476262
SQL_DBC_a2a1060 3193    DBA BASE        DBA     user        (NULL)      Row         Transaction     Intent      45309427737
SQL_DBC_a2a1060 3193    DBA BASE        DBA     user        (NULL)      Row         Transaction     WriteNoPK   45309427737
SQL_DBC_a2a1060 3193    DBA BASE        DBA     user        (NULL)      Row         Transaction     Intent      37399035938
SQL_DBC_a2a1060 3193    DBA BASE        DBA     user        (NULL)      Row         Transaction     WriteNoPK   37399035938
SQL_DBC_a2a1060 3193    DBA BASE        DBA     user        (NULL)      Row         Transaction     Intent      37399035939

如果我现在要从 Sybase SQL Anywhere 中选择 * FROM 用户,我将按预期获取所有行和数据。

但是,如果我要在 OpenSuse 11.4 上使用 iSQL 中的 DBA 用户触发相同的 SQL 语句,则语句会运行并且我会收到结果,直到将要选择的行设置了 WriteNoPK-Lockflag。该声明比陈述以下错误:

服务器消息号=8405 严重性=21 状态=0 行=0 文本=SQL Anywhere 错误 -210: 用户 'XYZ' 锁定了 'user' 中的行,SQL: 'SELECT * FROM user'

即使该行是 WriteNoPK-Locked,是否有可能读取/选择?

非常感谢,马克斯

4

1 回答 1

1

这是连接的隔离级别的结果。该行是更新锁定的,这可以防止其他进程获得可能的“脏读”(例如,读取尚未提交的更新值,并且可以回滚)

查看您当前的隔离级别:

SELECT CONNECTION_PROPERTY('isolation_level');

SQLAnywhere 文档中的这一部分讨论了不同的隔离级别设置,以及如何更改它们。隔离级别 0 或 1 可能会允许您继续阅读,但存在一定风险。您可能还想查看快照隔离设置,看看它是否适合您的需要。

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sqlanywhere.12.0.1/dbusage/udtisol.html

于 2013-10-21T14:05:35.447 回答