我目前正在将记录插入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生成的).出于某种原因,当我使用具有Serializable隔离级别的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字段作为主键/聚簇索引无效.
谢谢.
我一直在尝试将对象映射封装在项目数据存储库中.也许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) 我通过以下方式向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
给出以下代码:
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语句之后我需要什么才能看到减少的结果?如果一个值被推送到输入,我不希望看到任何东西.如果按下具有相同键的第二个值,我希望减速器应用(它确实如此),并且我还期望减少的结果继续到处理管道中的下一步.如上所述,我在管道的后续步骤中没有看到任何内容,我不明白为什么.
我要在本地“启动” Docker容器(独立于Kafka节点容器)中以分布式模式启动Kafka连接器。连接器按预期工作,但是当我杀死启动容器时,连接器停止工作。我希望它能够继续工作,因为我相信它会在另一个容器中的Kafka节点上的一个工作程序上注册并运行。我的设置如下:
目前,我正在通过Docker容器在本地运行所有内容。我有:
启动节点将下载适当的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群集注册了该连接器,尽管它是一个群集。连接器无法继续运行,并且似乎与启动节点一起消失。现在不应该由集群中的工作人员管理连接器吗?我需要更改启动连接器的方式还是误解了什么?
在 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
我试图以识别不同语言字符的方式分析一些UTF-8编码的文档.对于我的工作方法,我需要忽略非语言字符,例如控制字符,数学符号等.只是试图剖析UTF标准的基本拉丁部分导致了多个区域,像分区符号这样的字符正好在一系列有效拉丁字符的中间部分.
是否有某个列表可以识别这些区域?或者更好的是,一个正则表达式定义了C#中可以识别不同字符的区域或某些东西?
.net ×2
apache-kafka ×2
linq-to-sql ×2
c# ×1
deadlock ×1
decimal ×1
docker ×1
java ×1
lambda ×1
lucene ×1
nlp ×1
reduce ×1
search ×1
sql ×1
sql-server ×1
sqlparameter ×1
utf-8 ×1