C#Transaction Inside循环

时间:2018-02-12 10:53:27

标签: c# transactions

为了解释我的场景,我已经采用了2个表部门和员工,它的结构将如下所示,

Department      
DepartmentId    int IDENTITY
DepartmentName  varchar(2500    
Description varchar(500)    

Employee        
EmployeeId  int IDENTITY
EmployeeName    varchar(250)    
Age int 
DepartmentId    int 
IsActive    bit 

我们过去常常将员工和相关部门放在一个平面文件中,卷的数量将介于100到500之间。因此,我们提取数据,验证它并将所有有效记录存储在列表中(FileRow列表)。

最后,迭代列表中的有效记录,并在每次迭代时,我们执行以下操作,

Department detail is inserted
Departmentid value is retrieved
DepartmentId is assigned to Employee object and inserted into Employee Table.

截至目前,我们已经在迭代(For循环)之前启动了事务(TransactionScope),并且在迭代之后完成了事务。所有行都是不相关的,因此它们也可以单独插入。

那么,这是正确的还是我们需要在每次插入时创建事务?在循环中意味着什么?请告知哪些会提供更好的性能,也不会影响使用同一数据库的其他系统?

Logic will be,

Start Transaction
Iterate each valid FileRow from the list
insert into department
SaveChanges() method is called, Department ID will be generated
Take the DepartmentId value
Insert into Employee
Iteration ends
Transaction Complete

谢谢, 普拉卡什。

2 个答案:

答案 0 :(得分:0)

  

那么,这是正确的还是我们需要在每次插入时创建事务?

这不是技术问题。两者都有效,但两者都有不同的行为:事务是一个所有工作或 none 工作的包。那么,如果文件中的记录有问题,您希望发生什么?你想让一切都失败吗?或者你想插入除故障记录以外的所有记录?这将是您在特定情况中第一次提示您的正确答案

下一个程序的下一个循环,答案可能会有所不同。

答案 1 :(得分:0)

正如我评论的那样,这取决于你想要达到的目标。如果单个无效记录表明无法信任整个记录集,那么您的设计就可以了。但是,如果您希望将每条记录的有效性视为与整个集合的质量无关,那么您需要对每条记录的事务采用更细粒度的方法。

但是,如果您只是对性能感到困扰,那么需要考虑一些问题。根据隔离级别,单个事务可以阻止其他用户在事务期间从Department和Employee表中读取或更新数据。

根据您的情况,每条记录的交易将产生100-500笔交易的开销。这对我来说听起来不多,也不会明显阻碍其他用户。

由于您似乎并不要求整套记录有效,我会为每条记录执行较低级别的事务并监控性能,但我怀疑这是一个问题。