小编Las*_*sus的帖子

为什么以下SQL Server在事务中运行时会插入死锁?

我目前正在将记录插入SQL Server表,然后选择自动增量ID,如下所示:

(@p0 int,@p1 nvarchar(8))INSERT INTO [dbo].[Tag]([Some_Int], [Tag])
VALUES (@p0, @p1)

SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value] 
Run Code Online (Sandbox Code Playgroud)

(这是使用Linq-to-SQL生成的).出于某种原因,当我使用具有Seri​​alizable隔离级别的TransactionScope对象在事务中运行此代码时,SQL Server会引发死锁错误.我分析了死锁图事件,发现所涉及的两个进程都在等待另一个进行转换操作,因为我了解以下信息:

<resource-list>
   <keylock hobtid="72057594101170176" dbid="5" objectname="foo.dbo.Tag" indexname="PK_Tag_1" id="lockb77cdc0" mode="RangeS-S" associatedObjectId="72057594101170176">
    <owner-list>
     <owner id="processc9be40" mode="RangeS-S"/>
    </owner-list>
    <waiter-list>
     <waiter id="processc9ae38" mode="RangeI-N" requestType="convert"/>
    </waiter-list>
   </keylock>
   <keylock hobtid="72057594101170176" dbid="5" objectname="foo.dbo.Tag" indexname="PK_Tag_1" id="lockb77cdc0" mode="RangeS-S" associatedObjectId="72057594101170176">
    <owner-list>
     <owner id="processc9ae38" mode="RangeS-S"/>
    </owner-list>
    <waiter-list>
     <waiter id="processc9be40" mode="RangeI-N" requestType="convert"/>
    </waiter-list>
   </keylock>
  </resource-list>
Run Code Online (Sandbox Code Playgroud)

我的理解是,事务范围将阻止第二个进程执行插入,直到第一个进程完成插入和选择标识.然而,情况似乎并非如此.任何人都可以通过线程安全的方式阐明实现我需要的最佳方法吗?

- 更新 -

请注意; 我99%确定两个进程之间没有共享连接,因为每个进程都创建一个新的DataContext来与数据库通信.

- 再次更新 -

Remus Rusanu指出一些省略的信息与问题有关,我试图根据死锁图报告简化场景,但我在这里扩展了解释.在我执行插入之前,我在相关表上执行存在查询以确定标记是否已存在.如果是的话我结束了交易.如果不是插入应该继续,然后我在具有Some_Int主键的表上执行更新(此处未显示),尽管更新纯粹是针对最后修改的值.Tag表具有由auto inc ID和Some_Int组成的聚簇索引也很重要.我不认为这最后一条信息具有相关性,因为我尝试将表更改为仅将auto inc字段作为主键/聚簇索引无效.

谢谢.

c# sql-server deadlock transactionscope linq-to-sql

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

将Linq封装到SQL数据访问的最佳方法是什么?

我一直在尝试将对象映射封装在项目数据存储库中.也许EF将提供所需的抽象级别,但由于一系列原因我目前正在使用Linq to SQL.以下代码旨在将数据库中的用户作为ModUser对象列表返回,其中ModUser是存储库公开的POCO:

public List<ModUser> GetUsers() {
    Users.Select(MapUser).ToList();
}

public Expression<Func<User, ModUser>> MapUser {
    get {
        return u => new ModUser() {
            UserId = u.User_Id,
            UserResources = u.Resources(MapResource)
        }
    }
}

public Expression<Func<Resource, ModResource>> MapResource { ...
Run Code Online (Sandbox Code Playgroud)

代码将失败,因为我无法调用MapResource表达式,因为我试图从另一个表达式中调用它.我设法通过用'=> new ModResource()替换'MapResource'来解决这个问题,然后使用ExpressionVisitor找到这个占位符节点并用MapResource表达式替换它.

当我尝试使用涉及单个属性的表达式(即UserResource = MapResource)分配ModUser的属性时,我也遇到了类似的问题.我已经设法通过使用Expression类上的方法手动组合所需的表达式来解决第二个问题.

我意识到我可以将上面的代码更改为

UserResources = u.Resources(r => MapResource.Compile().Invoke(r));
Run Code Online (Sandbox Code Playgroud)

但是生成的最终SQL查询需要获取r的所有属性,而不仅仅是MapResouce所需的属性,因为我们现在处理的是一个函数.此外,如果MapResouce需要访问r上的其他表,则不可能,因为它被用作函数而不是表达式.我可以将DeferredLoadingEnabled设置为true,但这会产生大量单个查询,而不是修改主查询以与所需的任何表连接.

有谁知道在将来的.NET版本中这些操作是否会变得更容易,或者我是否会以错误的方式解决这个问题?我非常喜欢Linq和Expression功能,我希望我可以使用更易读的代码来使用它们.

更新

以为我可能会添加一些示例,说明我如何使表达式更具组合性.他们并不简洁,但他们完成了工作.

public Expression<Func<User, ModUser>> MapUser {
    get {
        Expression<Func<User, ModUser>> mapUser = u => new ModUser() {
            UserId = u.User_Id,
            UserResources = u.Resources(r => new ModResource())
        };
        return …
Run Code Online (Sandbox Code Playgroud)

.net lambda design-patterns expression-trees linq-to-sql

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

为什么小数SqlParameter会被破坏?

我通过以下方式向sproc发送十进制值:

SqlParameter meh = new SqlParameter("Foo", SqlDbType.Decimal);
meh.Value = "0.00001";
meh.Precision = ((System.Byte)(12));
meh.Scale = ((System.Byte)(9));
Run Code Online (Sandbox Code Playgroud)

当我分析数据库以查看对其运行的内容时,我看到如下参数:

....,@Foo decimal(12,9),....,@Foo=10000,....
Run Code Online (Sandbox Code Playgroud)

它似乎从小数点完全镜像,我该如何解决这个问题?请注意,我还尝试将字符串首先转换为实际小数,并使用它来设置'meh.Value',但它仍然存在同样的问题.

更新

我注意到,如上例所示,原始值的小数点向右移动了9个位置,与刻度完全相同.什么会导致这个?

再次更新

我应该注意到我正在使用Sql Server 2008

.net sql decimal sqlparameter

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

为什么我看不到Kafka Streams reduce方法的任何输出?

给出以下代码:

KStream<String, Custom> stream =  
    builder.stream(Serdes.String(), customSerde, "test_in");

stream
    .groupByKey(Serdes.String(), customSerde)
    .reduce(new CustomReducer(), "reduction_state")
    .print(Serdes.String(), customSerde);
Run Code Online (Sandbox Code Playgroud)

println在Reducer的apply方法中有一个声明,当我希望减少时,它会成功打印出来.但是,上面显示的最终打印语句不显示任何内容.同样,如果我使用to方法而不是print,我在目标主题中看不到任何消息.

在reduce语句之后我需要什么才能看到减少的结果?如果一个值被推送到输入,我不希望看到任何东西.如果按下具有相同键的第二个值,我希望减速器应用(它确实如此),并且我还期望减少的结果继续到处理管道中的下一步.如上所述,我在管道的后续步骤中没有看到任何内容,我不明白为什么.

java reduce apache-kafka apache-kafka-streams

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

当在其上创建节点的Kafka分布式连接器被杀死时,为什么会死亡?

我要在本地“启动” Docker容器(独立于Kafka节点容器)中以分布式模式启动Kafka连接器。连接器按预期工作,但是当我杀死启动容器时,连接器停止工作。我希望它能够继续工作,因为我相信它会在另一个容器中的Kafka节点上的一个工作程序上注册并运行。我的设置如下:

目前,我正在通过Docker容器在本地运行所有内容。我有:

  1. Zookeeper节点(3.4.9)
  2. Kafka节点(Apache,0.10.1.0)
  3. “启动”节点。

启动节点将下载适当的Kafka版本并解压缩其内容。然后,它构建连接器源,设置类路径以包含必要的JAR,然后按如下方式执行连接器:

connect-distributed.sh config/connect-distributed.properties
Run Code Online (Sandbox Code Playgroud)

分布式属性文件设置组ID,各种主题名称,模式和转换器,以及引导服务器(指向上面的Kafka节点(2))。

该命令似乎正常执行,并且成功启动了宁静的连接器http服务。然后,我可以向http:// example:8083 / connectors发出POST请求,提供连接器任务的配置。该命令将正确完成,并且连接器已成功启动。我可以从Kafka节点(2)的主题中进行消费,然后看到指示连接器正在工作并正在通过发送数据的输出。

当我杀死启动节点(3)时,我希望该连接器能够继续运行,因为我向Kafka群集注册了该连接器,尽管它是一个群集。连接器无法继续运行,并且似乎与启动节点一起消失。现在不应该由集群中的工作人员管理连接器吗?我需要更改启动连接器的方式还是误解了什么?

apache-kafka docker apache-kafka-connect

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

是否可以在 Elasticsearch 中使用 doc_values=true 过滤非索引字段

在 Elasticsearch 5.6 中使用以下映射:

"category" => [
    "type"=>"keyword",
    "doc_values"=>true,
    "index"=>false
    "store"=>true
]
Run Code Online (Sandbox Code Playgroud)

有人建议我可以编写一个查询来过滤该字段,因为它的 doc_values 设置,即使索引属性设置为 false,但似乎 doc_values 字段仅对聚合和排序有用。

是否可以创建一个过滤此字段的查询?

lucene search information-retrieval elasticsearch elasticsearch-5

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

在某处有UTF-8的语言字符区域列表吗?

我试图以识别不同语言字符的方式分析一些UTF-8编码的文档.对于我的工作方法,我需要忽略非语言字符,例如控制字符,数学符号等.只是试图剖析UTF标准的基本拉丁部分导致了多个区域,像分区符号这样的字符正好在一系列有效拉丁字符的中间部分.

是否有某个列表可以识别这些区域?或者更好的是,一个正则表达式定义了C#中可以识别不同字符的区域或某些东西?

nlp utf-8 character-encoding

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