【问题标题】:Sybase read row with WriteNoPK using iSQLSybase 使用 iSQL 使用 WriteNoPK 读取行
【发布时间】:2013-10-29 17:08:29
【问题描述】:

我使用的是 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 中SELECT * FROM user,我将按预期获取所有行和数据。

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

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

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

非常感谢, 最大

【问题讨论】:

    标签: sybase freetds sqlanywhere unixodbc rowlocking


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2019-01-23
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      相关资源
      最近更新 更多