TransactionScope 函数
从事 .net 中的事务处理。有关于通过子功能流动交易的问题。如果对象上下文在子方法中是通用的,我是否需要使用依赖事务?
例如,在下面的代码中 - 我在类的构造函数中声明对象上下文(不确定这是否是最佳实践)
public class EmployeeRepository
{
private EmployeeContext ec;
public EmployeeRepository()
{
objectContext = new EmployeeContext();
}
public InitTransaction(EmployeeEntity emp1)
{
using (TransactionScope transaction = new TransactionScope())
{
try
{ ec.employees.AddObject(emp1);
SubFunction1();
ec.SaveChanges();
}
catch
{
//catch
}
}
//commit the transaction here
ec.AcceptAllChanges();
}
public SubFunction1()
{
//some processing
//using same object context
ec.someother.AddObject(someobject);
ec.SaveChanges();
}
}
我希望子函数也成为事务的一部分? 在这种情况下,即使我使用相同的对象上下文,我是否应该在 SubFunction1 中使用依赖事务?或者我应该在 SubFunction1 中添加一个
using (TransactionScope transaction = new TransactionScope());
。正确方向的指针将不胜感激。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
事务范围可以嵌套(它们的工作方式类似于 SQL @@TRANCOUNT 机制),因此理论上您可以在存储库中使用 TransactionScopes,例如保持父:子表关系 ACID,而且也可以在业务/服务层中使用(例如,跨多个实体、可能跨多个数据库、甚至跨其他资源(例如消息队列和事务性文件系统
。 com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx" rel="nofollow noreferrer">默认隔离级别TransactionScope 是可串行读取的 - 这可能会导致锁定/死锁。
Transaction Scopes can be nested (they work similar to the SQL @@TRANCOUNT mechanism), so you could in theory use TransactionScopes in your Repository, e.g. to keep parent : child table relationships ACID, but also in your Business / Service layers as well (e.g. to have a Distributed Transaction across multiple entities, possible across multiple Databases, and even across other resources such as Message Queues and Transactional file systems.
Note that the default isolation level of TransactionScope is Read Serializable - this can lead to locking / deadlocks.
您可以考虑使用依赖注入来传递相同的
ObjectContext
,这样就可以避免TransactionScope
。不是在存储库中创建
Context
,而是通过构造函数注入它。看看 这个答案
You can consider using Dependency Injection to pass around the same
ObjectContext
so you can avoid theTransactionScope
.Instead of creating
Context
inside the Repository inject it through constructor.Take a look at this answer