我已经阅读过(或者从同事那里听到)在.NET中,TransactionScope可以达到超时,然后是VoteCommit(而不是VoteRollback).这是准确还是传闻?我无法在网上找到谈论这个问题的信息(如果这是一个问题),所以我想知道是否有人有任何直接的经验,可以解决一些问题?
想知道是否建议传递数据库连接对象(到其他模块)或让方法(在另一个模块中)负责设置它.我倾向于让方法设置它,以便在使用之前不必检查连接的状态,只是让调用者将任何所需的数据传递给设置连接所需的调用方法.
我正在开发一个与SQL Server 2005数据库通信的应用程序来执行一些存储过程.我的客户端要求所有事务都在C#端管理,而不是由SQL Server管理,因此我System.Transactions.TransactionScope在访问数据库时使用.但是,我刚看到System.Transactions.Transaction数据类型,我很困惑......每种类型的主要优点/缺点是什么?我应该使用哪一个?
请注意,我还必须使用Enterprise Library的数据访问应用程序块.
我无法弄清楚这是否是可接受的操作.我需要从SQL Server 2008数据库中选择记录然后删除它们,所有这些都是ASP.NET代码中的单个事务.请注意,.NET代码必须能够检索首先选择的数据.
这样的东西:
SELECT * FROM [tbl] WHERE [id] > 6;
DELETE FROM [tbl] WHERE [id] > 6
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用SQL Fiddle,但如果我这样做:
SELECT * FROM [tbl]
Run Code Online (Sandbox Code Playgroud)
我得到了完整的表格,好像没有删除任何内容.
编辑按照下面的要求,这里是检索记录的完整.NET代码:
string strSQLStatement = "SELECT * FROM [tbl] WHERE [id] > 6;" +
"DELETE FROM [tbl] WHERE [id] > 6";
using (SqlCommand cmd = new SqlCommand(strSQLStatement, connectionString))
{
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
//Read values
val0 = rdr.GetInt32(0);
val3 = rdr.GetInt32(3);
//etc.
}
}
}
Run Code Online (Sandbox Code Playgroud) 我是否正确地说从性能角度来看,sql事务在存储过程中比代码好得多?
目前我在存储过程中使用了大部分事务,但有时我使用代码来处理更复杂的例程 - 显然我尽可能地保持最小化.
只是有一个复杂的例程需要太多的"变量",在c#中编写sql事务要比使用SQL Server容易得多.这是代码可读性和性能之间的界限.
有任何想法吗?
什么更有效 - 在.net代码中使用IDbTransaction或在数据库中处理它?为什么?
应该使用哪两种可能的场景?
我想在同一个事务中创建一个具有角色的用户,但我对实现有一个问题.为了在事务中使用userStore并让它不自动保存更改并忽略我的事务,我必须关闭AutoSaveChanges.这使它等到我调用保存更改.这工作正常,但因为当我调用manager.Create时,用户现在不会返回userId,因为这是关闭我没有ID传递到userManager.AddToRole.有没有办法将我想要创建的用户添加到同一事务中的角色?
模块化编程是正确的方法,但它有时会导致需要额外努力和研究的问题.我有三个数据库插入函数,比如InsertName(),InsertAddress(),InsertPhoneNo()以它为例.如果在任何函数中发生异常,则必须执行所有这些函数,不会对数据库进行任何更改.
我能做的就是合并所有三合一并使用sqltransaction.
InsertDetails()
{
using (SqlTransaction sqlTransaction = cn.BeginTransaction())
{
using (SqlCommand cm = new SqlCommand())
{
cm.Transaction = sqlTransaction;
InsertName();//Code to insert name
Insertaddress();//code to insert address
InsertPhoneNo();//code to insert phone no
}
sqlTransaction.Commit();
}
}
Run Code Online (Sandbox Code Playgroud)
但上面的解决方案违背了我的模块化方法.是否可以将多个函数绑定到一个sql事务而不合并它们,如果不是哪种方法可以实现这一点.
我一次性完成了20多笔交易.我想用事务范围.可能吗?如果可能,那么使用transacation范围类比简单事务有什么好处.
使用事务范围的最佳做法是什么?
我正在阅读Vaughn Vernon关于实现领域驱动设计的书.我也经历过他的github中的书代码C#版本.
这本书的Java版本有装饰器@Transactional,我相信它来自spring框架.
public class ProductBacklogItemService
{
@Transactional
public void assignTeamMemberToTask(
string aTenantId,
string aBacklogItemId,
string aTaskId,
string aTeamMemberId)
{
BacklogItem backlogItem =
backlogItemRepository.backlogItemOfId(
new TenantId(aTenantId),
new BacklogItemId(aBacklogItemId));
Team ofTeam =
teamRepository.teamOfId(
backlogItem.tennantId(),
backlogItem.teamId());
backlogItem.assignTeamMemberToTask(
new TeamMemberId(aTeamMemberId),
ofTeam,
new TaskId(aTaskId));
}
}
Run Code Online (Sandbox Code Playgroud)
C#中的等效手动实现是什么?我正在考虑以下几点:
public class ProductBacklogItemService
{
private static object lockForAssignTeamMemberToTask = new object();
private static object lockForOtherAppService = new object();
public voice AssignTeamMemberToTask(string aTenantId,
string aBacklogItemId,
string aTaskId,
string aTeamMemberId)
{
lock(lockForAssignTeamMemberToTask)
{
// application …Run Code Online (Sandbox Code Playgroud)