标签: isolation-level

SQL Server:如何获取独占锁以防止竞争条件?

我有以下T-SQL代码:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION T1_Test

    /*This is a dummy table used for "locking" 
    and it doesn't contain any meaningful data.*/        
    UPDATE lockTable 
        SET ID = 1    
        WHERE ID = 1

    DECLARE @Count TINYINT 

    SELECT @Count = COUNT(*)
    FROM debugSP 

    WAITFOR DELAY '00:00:5';

    INSERT INTO debugSP 
        (DateCreated, ClientId, Result)
    SELECT 
        GETDATE(), @@SPID, @Count

COMMIT TRANSACTION T1_Test
Run Code Online (Sandbox Code Playgroud)

我正在使用标记为注释的"锁定"黑客获取独占锁.

注意:使用TABLOCKX或UPDLOCK提示将不起作用,因为我通过拆分语句并在中间添加WAITFOR命令以进行测试来破坏ATOMIC-ity.我不想要那样的东西:

INSERT INTO debugSP (DateCreated, ClientId, Result)
SELECT GETDATE(), @@SPID, COUNT(*) 
FROM debugSP
Run Code Online (Sandbox Code Playgroud)

这是运行两个同时会话(带锁表)后的正确结果

Id DateCreated           ClientId Result
-- ----------------------- …
Run Code Online (Sandbox Code Playgroud)

sql sql-server locking transactions isolation-level

3
推荐指数
1
解决办法
8553
查看次数

pandas.read_sql 使用 SQLAlchemy 未提交读取

我正在尝试使用 pandas 函数pd.read_sql读取flush在 SQLAlchemy 会话中创建、添加和编辑但未提交的记录。所以我想在 SQLAlchemy 会话中创建一个对象并在调用commit. 使用 Pandas 0.22.0 和 SQLAlchemy 1.1.10。

我已经尝试将isolation_leveloncreate_engine和其他各种将隔离级别设置为“READ UNCOMMITTED”的方法,但这似乎不起作用。下面的最小示例:

# Import packages 

import pandas as pd
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker

# Set up an example ORM

Base = declarative_base()
class Record(Base):
    __tablename__ = 'records'
    id = Column(Integer, primary_key=True)
    foo = Column(String(255))

# Create a session and engine:

database='foobar'
user=''
password = ''
host …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy isolation-level python-3.x pandas

3
推荐指数
1
解决办法
979
查看次数

如果两个事务都没有回滚,则读取已提交与未提交读取

我试图了解已提交读和未提交读隔离级别。我知道理论上读未提交允许脏读而提交读不允许,但我仍然无法真正理解。

这个例子

考虑上图,如果没有任何事务被中止,那么对于已提交读和未提交读的最终结果是否相同?

sql-server read-uncommitted isolation-level read-committed

3
推荐指数
2
解决办法
2148
查看次数

如何全局更改事务隔离级别?

如何更改数据库的默认事务隔离级别?

postgres文档展示了如何针对每个事务和每个会话更改它 - 但没有展示如何更改数据库或集群的默认值。

MySQL中的操作是

SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 有等效的吗?

sql database postgresql transaction-isolation isolation-level

3
推荐指数
1
解决办法
8041
查看次数

Microsoft SQL Server 2005中的默认隔离级别

SQL Server 2005中的默认隔离级别是什么?您希望在哪种情况下更改它?关于默认隔离级别的一点解释将不胜感激.

谢谢你的期待

sql sql-server-2005 isolation-level

2
推荐指数
1
解决办法
1581
查看次数

在数据库中启用快照隔离所需的用户权限是什么?

我有一个用户在数据库上拥有db_datareader,db_datawriter权限.我想将隔离级别设置为用户可以访问的DB.我的用户需要具有哪些权限才能设置这些权限.使用的数据库:SQL SERVER 2008

database isolation-level sql-server-2008

2
推荐指数
1
解决办法
8992
查看次数

是否使用当前事务隔离级别执行触发器?

考虑一个包含3列的表:ID(唯一的,取自Oracle序列),CATEGORY和CODE(最后两个没有约束).

每个类别都附加了多个代码,但代码在该类别中必须是唯一的.例:

ID    CATEGORY   CODE
1     1          X
2     1          Y
3     1          Y     //wrong
Run Code Online (Sandbox Code Playgroud)

第三个不行,因为我们已经为类别1提供了代码Y.

现在考虑在插入和检查之前运行的触发器,以查看要插入的值是否正常.也就是说,对于正在插入的记录,触发器读取类别,然后从表中读取具有该类别的所有代码,如果必须插入的记录中的代码已经存在,则引发异常以便记录没有插入.

我的问题是,如果事务隔离级别是,READ_COMMITED并且在两个不同的事务中几乎完全同时执行了两个插入但是事务稍后提交,那么触发器会在表中"看到"的内容是什么?

例:

(1)最初,表格如下所示:

ID    CATEGORY   CODE
1     1          X
Run Code Online (Sandbox Code Playgroud)

(2)T1和T2有两个事务(READ_COMMITED两者的隔离级别);

(3)两个交易都要插入category = 1和code = Y;

(4)T1执行插入并执行触发.表中没有Y所以可以插入;

(5)T2执行插入并执行触发.表中没有Y(T1尚未提交),因此可以插入;

(6)T1提交,表现在看起来像这样:

ID    CATEGORY   CODE
1     1          X
2     1          Y
Run Code Online (Sandbox Code Playgroud)

(7)T2现在提交.这里发生了什么?我是否收到错误并且未插入记录或我得到下表:

ID    CATEGORY   CODE
1     1          X
2     1          Y
3     1          Y     //this is wrong
Run Code Online (Sandbox Code Playgroud)

?!

触发器"看到"什么以及插入物会发生什么?

oracle triggers transactions isolation-level

1
推荐指数
1
解决办法
1539
查看次数

慢的SQL事务块表

我有一个非常慢的sql事务,它将在表中插入新行。来自其他连接的所有其他“选择”查询都将等待此操作来解锁表。

在第一个事务有效时,是否可以从表中获取旧行?

SqlExpress 2008 R2。例如:

    private void button1_Click(object sender, EventArgs e)
    {
        System.Threading.Thread t = new System.Threading.Thread(
            delegate()
            {
                var conn = new SqlConnection(@"Data Source=ARTNB\SQLEXPRESS;Initial Catalog=test;User ID=**;Password=******");
                conn.Open();
                var cmd = conn.CreateCommand();
                var tr = conn.BeginTransaction( IsolationLevel.RepeatableRead, "test");
                cmd.Transaction = tr;
                cmd.CommandText = @"INSERT INTO Cards (SerialNumber,OperationID,TariffID,RequestTime,State,AgentInfo) VALUES('1213','345',13, GETDATE(),1,'')";
                cmd.ExecuteNonQuery();
                //very slow transaction
                System.Threading.Thread.Sleep(300000);
                tr.Commit();
                conn.Close();
            });
        t.Start();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        var conn = new SqlConnection(@"Data Source=ARTNB\SQLEXPRESS;Initial Catalog=test;User ID=**;Password=******");
        conn.Open();
        var cmd = conn.CreateCommand();
        var …
Run Code Online (Sandbox Code Playgroud)

sql-server transactions isolation-level sql-server-2008r2-express

1
推荐指数
1
解决办法
1500
查看次数

我可以在Oracle中更改隔离级别吗?

我正在Oracle中编写一个事务.我可以在一个select语句中更改此事务中的隔离级别吗?现在我有Read Commit,我希望在事务中将此更改为可序列化,然后再返回读取提交.

最诚挚的问候,格雷戈里

oracle transactions commit isolation-level

1
推荐指数
1
解决办法
3399
查看次数

如何构建此交易?

我们有一个基于ASP.NET/MSSQL的Web应用程序,它可以生成带有连续订单号的订单.

当用户保存表单时,将按如下方式创建新订单:

  1. SELECT MAX(order_number)FROM order_table,调用此max_order_number
  2. 设置new_order_number = max_order_number + 1
  3. 使用此new_order_number(它只是订单记录中的字段,而不是数据库密钥)插入新订单记录

如果我在单笔交易中附上上述3个步骤,如果两个客户同时保存新订单,是否会避免创建重复的订单号?(并且假设系统最终位于具有多个IIS服务器和一个MSSQL服务器的Web场中).

由于系统中某处的并发性,我想避免两个客户选择相同的MAX(order_number).

应该使用什么隔离级别?谢谢.

c# sql-server asp.net transactions isolation-level

1
推荐指数
1
解决办法
143
查看次数