我们的应用程序最初是作为桌面应用程序编写的,多年前就是这样.无论何时打开编辑屏幕,它都会启动一个事务,如果单击"确定",则会提交,或者如果单击"取消",则会回滚.这适用于桌面应用程序,但现在我们正在尝试迁移到ADO.NET和SQL Server,并且长时间运行的事务是有问题的.
我发现当多个用户同时尝试编辑同一个表(不同的子集)时,我们会遇到问题.在我们的旧数据库中,每个用户的事务将获取他们在事务期间修改的每个记录的记录级锁定; 由于不同的用户正在编辑不同的记录,每个人都有自己的锁,一切正常.但是在SQL Server中,只要有一个用户在事务中编辑记录,SQL Server就会在整个表上获得锁定.当第二个用户尝试编辑同一个表中的不同记录时,第二个用户的应用程序只会锁定,因为SqlConnection会阻塞,直到第一个用户提交或回滚.
我知道长时间运行的事务很糟糕,我知道最好的解决方案是更改这些屏幕,以便它们不再能够长时间保持事务处理.但是,由于这将意味着一些侵入性和风险的变化,我还想研究是否有一种方法来使这些代码按原样运行,因此我知道我的选择是什么.
如何在SQL Server中获取两个不同用户的事务来锁定单个记录而不是整个表?
这是一个快速而肮脏的控制台应用程序,用于说明问题.我创建了一个名为"test1"的数据库,其中一个名为"Values"的表只有ID(int)和Value(nvarchar)列.如果您运行该应用程序,它会要求修改ID,启动事务,修改该记录,然后保持事务处于打开状态,直到您按Enter键.我希望能够
目前它在第4步冻结,直到我回到应用程序的第一个副本并关闭它或按ENTER键以便提交.对command.ExecuteNonQuery的调用将阻塞,直到第一个连接关闭.
public static void Main()
{
Console.Write("ID to update: ");
var id = int.Parse(Console.ReadLine());
Console.WriteLine("Starting transaction");
using (var scope = new TransactionScope())
using (var connection = new SqlConnection(@"Data Source=localhost\sqlexpress;Initial Catalog=test1;Integrated Security=True"))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = "UPDATE [Values] SET Value = 'Value' WHERE ID = " + id;
Console.WriteLine("Updating record");
command.ExecuteNonQuery();
Console.Write("Press ENTER to end …Run Code Online (Sandbox Code Playgroud) sql-server transactions nonblocking record-locking table-locking
我在C#中有一个应用程序,我需要做一些优化计算,就像Excel Solver Add-in一样,一个选项肯定是编写我自己的求解器实现,但是我有点时间,所以我正在研究已经存在的库可以帮助我解决这个问题.
我一直在尝试微软解决方案基金会,这看起来非常整洁和酷,问题是它似乎不适用于我需要做的那种计算.
在这个问题的最后,我正在添加有关我需要执行和优化的计算的信息.
所以基本上我的问题是,如果你们中的任何人知道我可以用于此目的的任何其他库,或任何可以帮助我自己的解算器的教程,或任何让我领导解决这个问题的想法.
谢谢.
附加信息:
这是我需要计算的数据:
我有7个变量,我们称之为var1,var2,...,var7
这些变量的约束是:
目标是最大化目标公式,在Excel中如下所示:
(MMULT(TRANSPOSE(L26:L32),M14:M20)) / (SQRT(MMULT(MMULT(TRANSPOSE(L26:L32),M4:S10),L26:L32))) Run Code Online (Sandbox Code Playgroud)
您在此公式中看到的范围L26:L32实际上是包含上述变量的范围,var1,var2,...,varn.
M14:M20和M4:S10是具有从不同来源获得的数据的范围,更可能是十进制值.
正如我之前所说,我使用的是Microsoft Solver Foundation,我用它来模拟几乎所有东西,我创建了处理目标公式操作的函数,但是当我尝试解决模型时它总是失败,我认为这是因为操作的复杂性.
在任何情况下,我只是想显示这些数据,以便您可以了解我需要实现的计算类型.
我希望在装订线(行号旁边)中关闭实现和重写装订线图标。它们的渲染导致我的编辑器窗口在每次重绘时都会跳(我键入的每个击键),这让我发疯。我正在使用版本8.1.4。
foreach(int i in array1)
{
Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下什么是"控制台"?
我有一个XMLDocument像:
<Folder name="test">
<Folder name="test2">
<File>TestFile</File>
</Folder>
</Folder>
Run Code Online (Sandbox Code Playgroud)
我只想要文件夹的,而不想要文件。那么,如何在c#中删除/操作XML文档以删除/删除文档中的所有元素?
谢谢!
为什么以下代码导致分段错误?(我正在尝试创建两个相同大小的矩阵,一个使用静态,另一个使用动态分配)
#include <stdio.h>
#include <stdlib.h>
//Segmentation fault!
int main(){
#define X 5000
#define Y 6000
int i;
int a[X][Y];
int** b = (int**) malloc(sizeof(int*) * X);
for(i=0; i<X; i++){
b[i] = malloc (sizeof(int) * Y);
}
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我注释掉其中一个矩阵定义,代码运行正常.像这样:
#include <stdio.h>
#include <stdlib.h>
//No Segmentation fault!
int main(){
#define X 5000
#define Y 6000
int i;
//int a[X][Y];
int** b = (int**) malloc(sizeof(int*) * X);
for(i=0; i<X; i++){
b[i] = malloc (sizeof(int) * Y);
}
}
Run Code Online (Sandbox Code Playgroud)
要么
#include <stdio.h>
#include <stdlib.h> …Run Code Online (Sandbox Code Playgroud) 函数存储在C++程序中的哪个位置?
例如
int abc()
{
//where am I stored?
}
Run Code Online (Sandbox Code Playgroud)
我知道我们可以获取函数的地址,这意味着函数存储在内存中的某个地方.但我已经在许多地方读过没有功能的内存分配.
我很迷惑.我的问题对你们许多人来说似乎含糊不清,但我无能为力.
在MS SQL Server Management Studio 2005中,运行此代码
EXEC('SELECT * FROM employees WHERE employeeID = ' + CAST(3 AS VARCHAR))
Run Code Online (Sandbox Code Playgroud)
给出了这个错误: Incorrect syntax near 'CAST'
但是,如果我这样做,它的工作原理:
DECLARE @temp VARCHAR(4000)
SET @temp = 'SELECT * FROM employees WHERE employeeID = ' + CAST(3 AS VARCHAR)
EXEC(@temp)
Run Code Online (Sandbox Code Playgroud)
我在这里找到了一个解释:T-SQL:不能将连接字符串作为参数传递给存储过程
根据接受的答案,EXEC可以将局部变量或值作为其参数,而不是表达式.
但是,如果是这种情况,为什么这样做:
DECLARE @temp VARCHAR(4000)
SET @temp = CAST(3 AS VARCHAR)
EXEC('SELECT * FROM employees WHERE employeeID = ' + @temp)
Run Code Online (Sandbox Code Playgroud)
'SELECT * FROM employees WHERE employeeID = ' + @temp 肯定看起来像一个表达式,但代码执行没有错误.
使用C#和Visual Studio以及MySQL数据连接器在数据库中存储枚举的最佳方法是什么.
我将创建一个包含100多个枚举的新项目,其中大部分都必须存储在数据库中.为每个人创建转换器将是一个漫长的过程,因此我想知道视觉工作室或某人是否有任何方法,我没有听说过.