gpt4 book ai didi

c# - 锁定数据库,使用 C#

转载 作者:搜寻专家 更新时间:2023-10-30 22:31:43 28 4
gpt4 key购买 nike

我在项目中使用 C#、EF 和 Microsoft SQL Server。我需要将整个数据库锁定在其中一台机器上,以便与 Active Directory 同步。

许多机器都可以访问数据库,所以我需要防止从其他机器读取、插入或更新我的数据库。

简单的例子,我现在尝试做的:

using (DB context = new DB())
using (var ts = context.Database.BeginTransaction(System.Data.IsolationLevel.Serializable))
{
context.Database.Connection.Open();

try
{
string sql = SQLProperties.getInstance().CurrentPropeties["User_Insert"];
StringBuilder sb = new StringBuilder(10240);

for (int chunkCount = 0; chunkCount < Math.Ceiling((decimal)count / commitCount); chunkCount++)
{
using (SqlCommand command = new SqlCommand())
{
command.Transaction = (SqlTransaction)ts.UnderlyingTransaction;

for (var i = 1; i <= commitCount; i++)
{
string query = sql;
int ind = chunkCount * commitCount + i;

query = string.Format(query, ind);

sb.Append(query);
//fill command.Params
}

command.Connection = (SqlConnection)context.Database.Connection;
command.CommandText = sb.ToString();

command.ExecuteNonQuery();
}

sb.Clear();
}

ts.Commit();
}
catch (Exception ex)
{
ts.Rollback();
}
}

但是当 ExecuteNonQuery() 被调用时,查询被发送到数据库并被执行。当我准备 SqlCommand 时,即使我使用单个事务,另一台机器也可以读取、插入或更新数据库中的数据。我需要禁用它。

此外,我还需要对数据库表中的数据进行许多其他更改,因此我想在同步期间锁定整个数据库

我知道在 Server Management Studio 中我可以使用 GO 语句进行批量 SQL 查询,但是 SqlCommand 不支持这一语句。我也尝试使用这种方法发送 GO 语句:

ServerConnection svrConnection = new ServerConnection((SqlConnection)context.Database.Connection);
Server server = new Server(svrConnection);
int f = server.ConnectionContext.ExecuteNonQuery("LOCK TABLES dbo.User WRITE");

但是好像不行。

我怎样才能从 C# 代码做到这一点?

补充:如何同步两个可能同时开始的交易?现在我遇到了一个问题,当一个事务开始在表中插入用户时,例如,在 500 个用户之后,另一个事务插入用户并且表包含来自两个事务的混合数据。我如何订购它们?

最佳答案

如果你真的需要锁定你可以使用的数据库:

ALTER DATABASE [xyz] SET SINGLE_USER 

这将限制其他用户连接到数据库的能力。

关于c# - 锁定数据库,使用 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42515312/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com