只是想知道,如果我想创建一个可以在TransactionScope中使用的类,我想要在TransactionScope中使用,我需要实现什么?
那就是:我的类需要知道它在一个Transaction中,但是如何在Commit或Rollback上得到通知?在Rollback上,我将如何实际回滚?
我假设我的类将具有"添加","更新"和"删除"等方法,这些方法仅修改临时更改列表,以及方法"读取",需要检测它是否在事务中并返回修改或未修改的数据相应地,但是我需要一个以某种方式调用的方法Commit/Rollback?
我会订阅Transaction.TransactionCompleted事件吗?如果是,我如何避免对同一交易的多个订阅?
我注意到事务没有ID,有没有办法管理/兼顾多个并发事务或嵌套事务?
System.Transactions的MSDN文档有很多内容,但似乎是针对消费者而不是实现者,所以我想知道某人是否有一个关于服务如何提供支持的良好来源(无论是在网络上还是在书中)交易?
让我们假设我的类没有已经支持事务的底层存储,并且只能"通过它".我们假设我的课看起来像这样:
public class MyClass {
private List<MyObject> _businessData;
public void Create(Myobject data) { ... }
public MyObject Read(string query) { ... }
public void Update(Myobject data) { ... }
public void Delete(Myobject data) { ... }
}
Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用Dapper进行一个项目,过去几年大多使用像NHibernate和EF这样的ORM.
通常在我们的Web应用程序中,我们按请求实现会话,在请求开始时开始事务并在结束时提交它.
我们应该在直接使用SqlConnection/System.Transactions时做类似的事情吗?
StackOverflow如何做到这一点?
根据@gbn和@Sam Safron的建议,我没有使用交易.在我的情况下,我只是在进行读取查询,因此似乎没有真正的要求使用事务(与我所知道的隐式事务相反).
我创建了一个轻量级的会话接口,以便每个请求都可以使用一个连接.这对我来说非常有益,因为对于Dapper我经常需要创建一些不同的查询来构建一个对象,而宁愿共享相同的连接.
确定每个请求的连接并处理它的工作是由我的IoC容器(StructureMap)完成的:
public interface ISession : IDisposable {
IDbConnection Connection { get; }
}
public class DbSession : ISession {
private static readonly object @lock = new object();
private readonly ILogger logger;
private readonly string connectionString;
private IDbConnection cn;
public DbSession(string connectionString, ILogger logger) {
this.connectionString = connectionString;
this.logger = logger;
}
public IDbConnection Connection { get { return GetConnection(); } }
private IDbConnection GetConnection() {
if (cn == null) {
lock (@lock) …Run Code Online (Sandbox Code Playgroud) 有没有办法确定为什么System.Transaction TrasactionScope被升级到DTC?我们的一个组件似乎升级了交易,而所有其他组件(看起来似乎相似)都没有升级,我们正在碰撞.
是否提供了有关升级原因的信息以及如何找到和遵守这些信息?SQL事件探查器?日志文件?或者我在这个上运气不好?
更新:我正在运行SQL Server 2005以获取信息
错误:
已禁用分布式事务管理器(MSDTC)的网络访问.请使用组件服务管理工具在MSDTC的安全配置中启用DTC以进行网络访问.
using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())
11 {
12 try
13 {
14 foreach (DataRow row in this.dt1.Rows)
15 {
16 int titleId = int.Parse(row["titleId"].ToString());
17 string fname = row["fname"].ToString();
18 string lname = row["lname"].ToString();
19
20 if (cmd.Parameters.Count > 0)
21 cmd.Parameters.Clear();
22
23 cmd.Parameters.AddWithValue("@titleId", titleId);
24 cmd.Parameters.AddWithValue("@fname", fname);
25 cmd.Parameters.AddWithValue("@lname", lname);
26 cmd.ExecuteNonQuery();
27
28 }
29 con.Close();
30 ts.Complete();
31 }
32 catch (Exception ex)
33 {
34
35 }
36 }
37 }
Run Code Online (Sandbox Code Playgroud) 我们正在尝试使用下面的代码.NET 3.5和SQL Server 2005进行间接嵌套事务.
MSDN说,当使用TransactionScope时,只要应用程序在事务中打开第二个连接(甚至是同一个数据库),事务就会升级.
void RootMethod()
{
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
FirstMethod();
SecondMethod();
scope.Complete();
}
}
void FirstMethod()
{
using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
using (SqlConnection conn1 = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI"))
{
string insertString = @"
insert into Categories
(CategoryName, Description)
values ('Laptop1', 'Model001')";
conn1.Open();
SqlCommand cmd = new SqlCommand(insertString, conn1);
cmd.ExecuteNonQuery();
}
scope.Complete();
}
}
void SecondMethod()
{
using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
using (SqlConnection conn2 …Run Code Online (Sandbox Code Playgroud) 因此,基于回答我刚才的问题,交易也得到来自LTM到DTC,如果多个连接在一个事务中打开,即使连接都具有相同的连接字符串升高.
所以,我的下一个问题是,可以采用什么策略来避免这种"功能"?在我看来,基于资源使用,我想确保尽可能多地使用LTM.在正确的面向对象的业务逻辑层中,我能想到的唯一方法是在数据访问层创建请求级静态连接对象,并在调用之间共享,直到请求完成(这里隐含的知识)是业务对象实体是谨慎的,不知道他们被调用的是什么顺序,另外一个事实是,人们不希望将连接对象冒泡到业务对象层,因为这将是数据存储实现细节流血到另一层).
有没有其他人有任何想法不会完全破坏n层系统的层封装?
architecture ado.net transactions system.transactions n-tier-architecture
我试图围绕在C#中使用System.Transactions命名空间.我在MSDN上找到了一些关于使用资源管理器的文档,但它只涵盖任何细节的易失性内存资源管理器(如Transactional).我基本上在寻找可以在TransactionScope中使用的东西,就像Transactional <>一样,但是用它来写入/修改/删除磁盘上的文件.标准库中是否存在类似的内容?我已经读过NTFS现在有"TxF"允许事务性文件系统访问 - 我期望在.net中找到一些利用它的东西.也许我需要实现自己的?
我见过System.Transactions命名空间,并且想知道,我是否可以使用此命名空间使用实际生成RDMBS?
但是当我看到一些例子时,我不明白System.Transactions如何做除了简单的try catch以及获得成功/失败结果之外的任何事情?
这是MSDN网站上的示例,我知道它可能非常简单,但我无法理解此示例中的好处,有人可以告诉我以下示例中的简单try/catch和Transaction范围之间有什么区别.
如果我应该创建一个RDBMS(创建我自己的RDMBS),我知道我们必须将大量日志写入我们执行的操作的磁盘,最后我们在回滚的情况下撤消这些操作,但这里什么也没有关于撤消任何事情.
// This function takes arguments for 2 connection strings and commands to create a transaction
// involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the
// transaction is rolled back. To test this code, you can connect to two different databases
// on the same server by altering the connection string, or to another 3rd party RDBMS by
// altering the code in the …Run Code Online (Sandbox Code Playgroud) 这篇文章的基本问题是"为什么非升级的LTM交易会受到质疑?"
我收到System.Transactions.TransactionInDoubtException,我无法解释原因.不幸的是我无法重现这个问题,但根据跟踪文件它确实发生了.我正在使用SQL 2005,连接到一个数据库并使用一个SQLConnection,所以我不希望进行促销.错误消息表示超时.但是,有时我得到一条超时消息,但异常是事务已中止而不是有疑问,这更容易处理.
这是完整的堆栈跟踪:
System.Transactions.TransactionInDoubtException: The transaction is in doubt. ---> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() at System.Data.SqlClient.TdsParserStateObject.ReadBuffer() at System.Data.SqlClient.TdsParserStateObject.ReadByte() at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, …
c# transactions sql-server-2005 transactionscope system.transactions
跨不同的AppDomain和进程使用System.Transactions(主要是TransactionScope)是真的吗?
DependentTransaction仅在一个AppDomain内部工作.
.net ×5
c# ×4
transactions ×4
ado.net ×2
.net-4.0 ×1
architecture ×1
asp.net ×1
dapper ×1
database ×1
escalation ×1
msdtc ×1
ntfs ×1
sql-server ×1
trace ×1
txf ×1