C# 是否在任何行的事务锁定下选择最大值(字段)?

C# 是否在任何行的事务锁定下选择最大值(字段)?,c#,sql-server,ado.net,C#,Sql Server,Ado.net,我们有这段代码,我想知道,在正常的Ado.net事务下,它会锁定任何行吗?样本: var sql1 = "SELECT MAX(entryNum) FROM tbl1 WHERE processNum = 1"; var cmd = new SqlCommand(sql1, conn, tran); var newEntryNum = cmd.ExecuteScalar(); . . . . . . var sql2 = "INSERT INTO tbl2 (entryNum) VALUES

我们有这段代码,我想知道,在正常的Ado.net事务下,它会锁定任何行吗?样本:

var sql1 = "SELECT MAX(entryNum) FROM tbl1 WHERE processNum = 1";
var cmd = new SqlCommand(sql1, conn, tran);
var newEntryNum = cmd.ExecuteScalar();
. . . . . . 
var sql2 = "INSERT INTO tbl2 (entryNum) VALUES (" + newEntryNum  + ")";
cmd = new SqlCommand(sql2, conn, tran);
在第一次选择中,它是否会用processNum=1锁定记录?在我看来,似乎没有什么东西会被锁定。是否有充分的理由在事务完成方式下执行SELECT MAX

通过锁定一行,我假设您的意思是防止另一个事务修改该行?我之所以提到这一点,是因为数据库在不同的时间放置各种锁,从而导致不同的锁定行为

无论如何,问题的答案与编程语言或ADO.NET无关。它完全取决于用于事务的数据库和隔离级别

例如,在SQL Server中,如果您在读取提交模式下运行(我通常会说,一旦select查询完成,它将不会阻止另一个事务修改processNum=1的行)

但是,如果您处于可重复读取或可序列化模式,则“是”,执行select查询将锁定processNum=1的行,这将阻止其他事务修改这些行,直到您完成事务为止

您可以在此处阅读有关SQL Server如何为不同隔离级别设置锁的更多信息:


在前面的问题编辑中,您还想知道在Oracle数据库中如何处理这个问题。这一点很简单:无论使用哪种隔离级别,读卡器都不会阻止写入器,因此select查询永远不会阻止其他事务修改行。

2种不同的编程语言和2种不同的数据库服务器?下定决心。。。有了超过6k的销售代表,你现在应该知道得更清楚了。@DavidG我发布了更容易理解的代码。我们有抽象实际命令、阅读器等的对象,并且我们使用vb和c。我不希望vb的人知道答案就回避为什么这个问题太宽泛了?这是一个具体的问题——锁定还是不锁定?是的,你是对的,我把这篇文章发布给了更多的读者。我只是亲自去测试了一下。我对SqlServer的了解是RepeatableRead锁定了行的子集-rocesnum=1。而Serializable则锁定整个表。如果没有添加隔离,所有行都将解锁,甚至可以截断表。这就回答了我更大的问题——锁定SELECT MAX确实会有所收获,但前提是选择了适当的隔离级别,在本例中是RepeatableRead