取消 .NET Core 中的存储过程

蜘蛛

我有一张桌子:

CREATE TABLE [dbo].[Semaphores](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nchar](10) NULL
) ON [PRIMARY]

我有一个存储过程:

ALTER PROCEDURE [dbo].[SpCreateLock] @Name nvarchar(50)
AS
BEGIN
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    BEGIN TRANSACTION
        INSERT INTO Semaphores VALUES (@Name)
        Waitfor delay '00:00:10'
    COMMIT TRANSACTION
END

我有一个简单的 Console .NET Core 应用程序:

class Program
{
    private static readonly DbContextOptions DbContextOptions;

    static Program()
    {
        var connectionString = "server=(localdb)\\ProjectsV13; database=test; trusted_connection=true";

        DbContextOptions = new DbContextOptionsBuilder()
            .UseSqlServer(connectionString)
            .Options;
    }

    static async Task Main(string[] args)
    {
        await TryGetLock();
        Console.ReadKey();
    }

    private async static Task TryGetLock()
    {
        using (var context = new DatabaseContext(DbContextOptions))
        using (var cancellationTokenSource = new CancellationTokenSource())
        {
            var cancellationToken = cancellationTokenSource.Token;

            cancellationTokenSource.CancelAfter(5000);
            cancellationToken.ThrowIfCancellationRequested();

            try
            {
                context.Database.OpenConnection();
                var result = await context.Database.ExecuteSqlCommandAsync("exec SpCreateLock qwerty", cancellationToken);
            }
            catch (OperationCanceledException e)
            {
            }
        }
    }
}

我在 Main 中调用 TryGetLock 方法。应用程序启动后,我转到 ssms 并调用一个简单的select * from Semaphores- 它暂停(正在执行查询),因为 .NET Core 应用程序正在使用该表(可序列化隔离级别)。在我的应用程序中的查询被取消后,我希望 ssms 中的查询完成 - 但它不是,它显然是死锁的。它仅在我关闭 .NET Core 应用程序时完成。我尝试关闭,处理数据库连接,但它没有改变任何东西。

我在这里缺少什么?

蜘蛛

我最终摆脱了从 sql 过程中创建事务并将其放置在 c# 代码中。

sql:

ALTER PROCEDURE [dbo].[SpCreateLock] @Name nvarchar(50)
AS
BEGIN
    INSERT INTO Semaphores VALUES (@Name)
    Waitfor delay '00:00:10'
END

C#:

class Program
    {
        private static readonly DbContextOptions DbContextOptions;

        public static readonly LoggerFactory MyLoggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider((_, __) => true, true) });

        static Program()
        {
            var connectionString = "server=(localdb)\\ProjectsV13; database=test; trusted_connection=true";

            DbContextOptions = new DbContextOptionsBuilder()
                .UseSqlServer(connectionString)
                .EnableSensitiveDataLogging()
                .UseLoggerFactory(MyLoggerFactory)
                .Options;
        }

        static async Task Main(string[] args)
        {
            await TryGetLock();
            Console.ReadKey();
        }

        private async static Task TryGetLock()
        {
            IDbContextTransaction transaction = null;
            var context = new DatabaseContext(DbContextOptions);
            var cancellationTokenSource = new CancellationTokenSource();

            try
            {
                var cancellationToken = cancellationTokenSource.Token;

                cancellationTokenSource.CancelAfter(5000);
                context.Database.OpenConnection();
                transaction = context.Database.BeginTransaction(IsolationLevel.Serializable);

                var result = await context.Database.ExecuteSqlCommandAsync("exec SpCreateLock qwerty", cancellationToken);

                context.Database.CommitTransaction();
            }
            catch (Exception e)
            {
                context.Database.RollbackTransaction();
            }
            finally
            {
                cancellationTokenSource?.Dispose();
                transaction?.Dispose();
                context?.Dispose();
            }
        }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

存储过程在.net Core中填充模型

来自分类Dev

dot net core中的存储过程

来自分类Dev

在.NET Core 3.0 Worker服务中管理令牌上的取消

来自分类Dev

.NET CORE FindByEmailAsync 操作被 REST 调用取消

来自分类Dev

如何在ASP.NET Core 3.0中的存储过程中添加参数

来自分类Dev

取消对存储过程的调用

来自分类Dev

使用ASP.NET Core2.2中的CancellationToken取消内部任务

来自分类Dev

尝试为.NET Core 3.0中的角色设定种子时,获取任务被取消的错误

来自分类Dev

将ASP.NET Core剃须刀页面中的下拉列表绑定到ado.net存储过程

来自分类Dev

如何使用 .NET CORE 获取存储过程的实际结果?

来自分类Dev

如何在Dot Net Core 3.1中使用FromSqlInterpolated / Database.ExecuteSqlInterpolated执行带有输出参数的存储过程?

来自分类Dev

EF Core 3.0中的存储过程

来自分类Dev

无法在.NET中运行存储过程

来自分类Dev

取消.Net 4.0中的任务延迟

来自分类Dev

VB.NET 中的空取消引用

来自分类Dev

ASP.NET Core 和 EF Core 1.1 - 使用存储过程显示数据

来自分类Dev

存储过程不可取消

来自分类Dev

如何将多个参数传递给.net Core 3.1上的存储过程

来自分类Dev

如何从ASP.NET Core 3.1 MySql.Data.EntityFrameworkCore调用MySQL存储过程

来自分类Dev

ASP.NET MVC Core更新记录存储过程不返回任何内容

来自分类Dev

.NET Core中的SOAP?

来自分类Dev

.NET Core中的Ninject

来自分类Dev

如何在Entity Framework Core中运行存储过程?

来自分类Dev

Scaffold-DbContext存储过程仅在EF Core中

来自分类Dev

在EF Core 3.0与2.2中执行存储过程

来自分类Dev

忽略EF Core中的存储过程以外的类属性

来自分类Dev

如何取消ASP.NET Core应用程序以重启Docker容器

来自分类Dev

ASP.NET Core Auth0-无法取消保护消息

来自分类Dev

C# .NET CORE:如果返回某种结果,则取消其他任务

Related 相关文章

  1. 1

    存储过程在.net Core中填充模型

  2. 2

    dot net core中的存储过程

  3. 3

    在.NET Core 3.0 Worker服务中管理令牌上的取消

  4. 4

    .NET CORE FindByEmailAsync 操作被 REST 调用取消

  5. 5

    如何在ASP.NET Core 3.0中的存储过程中添加参数

  6. 6

    取消对存储过程的调用

  7. 7

    使用ASP.NET Core2.2中的CancellationToken取消内部任务

  8. 8

    尝试为.NET Core 3.0中的角色设定种子时,获取任务被取消的错误

  9. 9

    将ASP.NET Core剃须刀页面中的下拉列表绑定到ado.net存储过程

  10. 10

    如何使用 .NET CORE 获取存储过程的实际结果?

  11. 11

    如何在Dot Net Core 3.1中使用FromSqlInterpolated / Database.ExecuteSqlInterpolated执行带有输出参数的存储过程?

  12. 12

    EF Core 3.0中的存储过程

  13. 13

    无法在.NET中运行存储过程

  14. 14

    取消.Net 4.0中的任务延迟

  15. 15

    VB.NET 中的空取消引用

  16. 16

    ASP.NET Core 和 EF Core 1.1 - 使用存储过程显示数据

  17. 17

    存储过程不可取消

  18. 18

    如何将多个参数传递给.net Core 3.1上的存储过程

  19. 19

    如何从ASP.NET Core 3.1 MySql.Data.EntityFrameworkCore调用MySQL存储过程

  20. 20

    ASP.NET MVC Core更新记录存储过程不返回任何内容

  21. 21

    .NET Core中的SOAP?

  22. 22

    .NET Core中的Ninject

  23. 23

    如何在Entity Framework Core中运行存储过程?

  24. 24

    Scaffold-DbContext存储过程仅在EF Core中

  25. 25

    在EF Core 3.0与2.2中执行存储过程

  26. 26

    忽略EF Core中的存储过程以外的类属性

  27. 27

    如何取消ASP.NET Core应用程序以重启Docker容器

  28. 28

    ASP.NET Core Auth0-无法取消保护消息

  29. 29

    C# .NET CORE:如果返回某种结果,则取消其他任务

热门标签

归档