[英]SQL Server Transactions — C#
我需要帮助。 让我首先用一个小样本来解释这种情况。
假设我有一个带有列的Students
表:
Id int(PK)
Name varchar(200)
Marks1 int
Marks2 int
Marks3 int
TotalMarks int
IsTotalCalculated bit
InProcess bit
该表具有大量记录。
现在,我想计算每个学生的TotalMarks
并更新TotalMarks
列。
现在进入我的C#控制台应用程序,我正在调用存储过程:
SP1 =>我一次获取前两个记录,该记录的InProcess = 0和IsTotalCalculated = 0,设置其InProcess = 1并进行处理。 (具有SELECT和UPDATE)
SP2 =>最后再次更新这两行,以更新其IsTotalCalculated = 1和InProcess = 0(UPDATE)
关注:我担心的是,一旦我选择2行进行处理,那么任何其他Console App实例都不应选择这2行进行处理。 我该怎么办?
注意:我已经将两个SP的C#代码放在TransactionBlock中。
谢谢,
贾斯汀·塞缪尔(Justin Samuel)
您不能仅在InProcess = 1中检查SP1,然后在InProcess变为0时忽略其余部分吗?
诀窍是在将InProcess更新为1时阻止任何读取。这可以通过SET TRANSACTION ISOLATION LEVEL READ COMMITTED来完成,该操作指定语句(在SP中)不能读取已被修改但未被其他事务提交的数据。
希望这可以帮助。
为什么要在C#中执行此操作? 这对于T-SQL是完美的!
UPDATE
dbo.Students
SET
TotalMarks = (some formula),
IsTotalCalculated = 1
WHERE
IsTotalCalulated = 0
一条T-SQL语句就完成了,您无需担心事务作用域和来回拖曳的数据负载.......
好的,因此,如果您必须坚持当前的方法,可以执行以下操作:
关注:我担心的是,一旦我选择2行进行处理,那么任何其他Console App实例都不应选择这2行进行处理。 我该怎么办?
如何“隐藏” Students
表,例如不允许任何人访问它,而是使用它上方的视图,该视图仅显示InProcess = 0的行?
CREATE VIEW dbo.StudentsView
AS
SELECT (list of fields)
FROM dbo.Students
WHERE InProcess = 0
这样,任何阅读学生的请求都将始终仅阅读当前未处理的那些请求。
我确定您有按自己的方式做事的理由,但是如果这是实际表格,而不仅仅是说明性的示例,那为什么不使用带有计算得出的Total列的视图呢? 然后,您无需使用控制台应用程序处理行,也无需锁定任何行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.