- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果我们开始一个事务,然后执行一些数据库操作,比如插入,然后发生异常,如果我不在捕获/异常处理程序中调用 transaction.rollback(),事务会自动回滚吗?
即使事务被回滚,是否会导致内存泄漏,即事务对象和连接对象以其原始状态在内存中徘徊,直到垃圾收集器启动?
CREATE TABLE [Friend]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[FullName] [varchar](50) NOT NULL,
[Phone] [varchar](50) NULL,
)
客户:
namespace Client
{
class Program
{
static void Main(string[] args)
{
DaContract Impl = new Impl();
Impl.AddFriend(new Friend("Someone", "100"));
Impl.AddFriend(new Friend("Someone else"));
Console.ReadLine();
}
}
}
服务器:
using System;
using MyLib.DataAccess;
using System.Data;
namespace TestTransactionAndConnectionStateOnException
{
public class Friend
{
public string FullName;
public string Phone;
public Friend(string fullName): this(fullName, null) {}
public Friend(string fullName, string phone)
{
this.FullName = fullName;
this.Phone = phone;
}
}
public interface DaContract
{
int AddFriend( Friend f );
int UpdatePhone(string fullName, string phone);
}
public class Impl: DaContract
{
Mediator _m;
public Impl() { this._m = new Mediator(); }
public int AddFriend( Friend f )
{
int ret = 0;
try
{
ret = this._m.AddFriend( f );
}
catch(Exception ex)
{
HandleException(ex);
}
return ret;
}
public int UpdatePhone(string fullName, string phone)
{
int ret = 0;
try
{
ret = this._m.UpdatePhone(fullName, phone);
}
catch(Exception ex)
{
HandleException(ex);
}
return ret;
}
public void HandleException(Exception ex)
{
/* see the transaction state */
/* see connection state */
/* do nothing and let the client call another method to initiate a new
* transaction and a new connection */
}
}
public class Mediator
{
private string _connectionString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=MyFriends";
private Manager _m = new Manager();
public int AddFriend( Friend f )
{
int ret = 0;
using (ISession session = SessionFactory.Create(SessionType.Ado, this._connectionString))
{
session.BeginTransaction();
ret = this._m.AddFriend(f, session);
session.CommitTransaction();
}
return ret;
}
public int UpdatePhone(string fullName, string phone)
{
int ret = 0;
using (ISession session = SessionFactory.Create(SessionType.Ado, this._connectionString))
{
session.BeginTransaction();
ret = this._m.UpdateFriend(fullName, phone, session);
session.CommitTransaction();
}
return ret;
}
}
public class Manager
{
public int AddFriend(Friend f, ISession session) { return Handler.Instance.AddFriend(f, session); }
public int UpdateFriend(string fullName, string phone, ISession session) { return Handler.Instance.UpdatePhone(fullName, phone, session); }
}
public class Handler
{
private static Handler _handler = null;
private Handler() {}
public static Handler Instance
{
get
{
if (_handler == null)
_handler = new Handler();
return _handler;
}
}
public int AddFriend( Friend f, ISession session )
{
/* check session, transaction and connection states here */
Console.WriteLine(session.Connection.State.ToString());
int ret = 0;
/* Add the friend */
IDbCommand command = session.CreateCommand();
command.CommandType = CommandType.Text;
command.CommandText = string.Format("INSERT INTO Friend(FullName, Phone) values('{0}', '{1}')", f.FullName, f.Phone);
ret = command.ExecuteNonQuery();
/* throw an exception just for the heck of it (don't dispose off ISession yet) */
if (string.Compare(f.FullName, "Someone", true) == 0)
throw new Exception("Fake exception. Friend value can't be 'Someone'");
return ret;
}
public int UpdatePhone(string fullName, string phone, ISession session )
{
return 0;
}
}
}
由于字数限制,我无法在评论部分发布代码,因为它搞砸了所有格式。
最佳答案
如果事务没有提交就被释放,事务将被回滚。所以只要你执行一个 using() 来开始你的事务,或者有一个调用 Dispose() 的 finally block ,它就会在异常情况下自动回滚。
如果您不处理事务/连接,它最终会被垃圾收集器回收,但会一直保留在内存中直到那时。 (事实上,托管的 SqlTransaction 对象将在内存中徘徊,直到 GC 无论如何启动;但处置确保非托管事务/连接资源的早期清理,释放服务器端资源并释放连接以供重用。)
关于c# - SQL Server 2005 上的 ADO.NET 2.0 事务是否在出现异常时自动回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/790105/
我刚刚读过“Injecting Custom Logic in ADO.NET Data Services”,我的下一个问题是,如何使[WebGet]方法显示在客户端代理类中?当然,我可以直接使用We
我需要学习 ADO.NET 来构建基于 MS Office 的应用程序。我在 MSDN 库中阅读了大量有关 ADO.NET 的内容,但对我来说,一切都显得相当困惑。 使用 ADO.NET 时必须了解哪
所以这是交易。在我们的数据库中,出于安全性和模块化的目的,我们将大部分读取(即选择语句)包装在表值函数中。所以我有一个定义一个或多个可选参数的 TVF。 我相信具有默认参数的 TVF 要求使用关键字
我需要通过 ADO.NET 创建一个临时表,执行一个 BulkCopy然后是 Merge在临时表和实际表之间的服务器上。 问题是使用纯 ADO.NET 创建动态临时表。 架构应该与现有表相同,但该表是
我开发了一个带有自定义数据库配置的产品。我将 ADO.NET 与 System.Data.Odbc.OdbcConnection 结合使用。为了在数据库之间做出一些区别,有一个简单的解决方案来检测连接
我有一些 friend 是“老派”VB6 数据库开发人员,我向他们介绍了 .NET 及其功能,特别是 ADO.NET。 在我们的谈话中,他们提出了为什么他们宁愿坚持使用 ADO 而不是转向 ADO.N
我有一个有 6 列的数据库表。主键是由 6 列中的 5 列组成的复合键 我正在尝试使用 SqlClient.SqlCommandBuilder.GetDeleteCommand删除该行。 但是我收到以
我已经编写了一个围绕 ADO.NET 的 DbProviderFactory 的包装器,我在我的应用程序中广泛使用它。我还编写了很多将 IDataReader 行映射到 POCO 的代码。然而,由于我
我知道这已经被问过了。 大多数答案都不相关。 谷歌,显示解决方案是在“数据流任务”中配置表达式并设置查询。 然而,在 ADO .NET 源代码中,当我尝试预览输出时,我不断收到 "Must decla
我的代码如下: var statement = "test_oracle.sql"; F = aqFile.OpenTextFile(statement, aqFile.faRead, aqF
可以从 MATLAB 调用 .NET,所以我想我会尝试使用 ADO.NET 连接到数据库。 我似乎遇到了一个阻塞问题 - 无论何时您尝试创建一个 Command 对象,它都会抛出一个错误。 你可以自己
在中发现的物体之间有什么类比? JDBC 以及在 中找到的那些ADO.Net ? 我知道 JDBC 和 ADO.Net 中的对象模型并不完全相同,但我认为可以在它们之间找到一些类比(以及值得说明的关键
我有一个在 DbProviderFactory 的 machine.config 中注册的 ADO.NET 托管数据提供程序 - 它可供 Analysis Services 使用,因此我知道它已正确注
我一直在阅读有关 TransactionScope 的内容,并对它与 ADO.Net 事务的互操作性有疑问。现在我们有一些数据访问方法,每个方法都调用存储过程并开始和提交自己的单独事务。简单明了,样板
是否可以在不借助 DataAdapter 的情况下在 ADO.NET 中实现多个存储过程调用的批处理(执行更新/删除)? 最佳答案 您可以尝试使用 System.Data.SqlClient.SqlC
是否可以获取 OleDbCommand 的文本?用它们的值替换所有参数?例如。在下面的代码中,我正在寻找一种获取查询文本的方法 SELECT * FROM my_table WHERE c1 = 'h
什么更快 - ADO.NET 或 ADO.NET Entity Framework ? 最佳答案 没有什么比 ADO.NET 数据读取器更快了。 Entity Framework 也在“地下室”中使用
我需要 .NET Core 上的 ODP.NET(适用于 .NET 的 Oracle 数据提供程序),但无论如何找不到使其工作。 当我引用 OracleConnection 或 OracleComma
我正在启动一个基于 ASP.NET 和 Windows 服务器的新项目。 该应用程序计划非常大,并且为大量客户端提供高频拉取和更新服务。更改数据。 我之前曾使用 Linq-To-Sql 或 Ado.N
有没有其他快速的方法来在 ADO.Net 中填充数据表而不使用 Data adaptor.Fill 方法? 最佳答案 是的,你可以。这是一个简短的例子: var results = new DataT
我是一名优秀的程序员,十分优秀!