C# 我可以在业务层使用TransactionScope而不是在数据提供程序中使用SQLiteTransaction吗?
我想在我的业务层中使用TransactionScope类: 在AdminService类中:C# 我可以在业务层使用TransactionScope而不是在数据提供程序中使用SQLiteTransaction吗?,c#,.net,sqlite,transactions,transactionscope,C#,.net,Sqlite,Transactions,Transactionscope,我想在我的业务层中使用TransactionScope类: 在AdminService类中: public void DeleteSchoolclass(Schoolclass schoolclass) { using (var trans = new TransactionScope()) { adminProvider.DeleteSchoolclass(schoolclass.SchoolclassId); timetableProvider
public void DeleteSchoolclass(Schoolclass schoolclass)
{
using (var trans = new TransactionScope())
{
adminProvider.DeleteSchoolclass(schoolclass.SchoolclassId);
timetableProvider.DeleteTimeTableEntry(schoolclass.SchoolclassCode);
trans.Complete();
}
}
当我调试两个Delete方法时,dataprovider中每个Delete命令对象的Transaction属性都为NULL,因此似乎没有事务。。。如何确定是否使用了事务
如果我调试transactionscope对象,我找不到任何连接
TransactionScope看起来很神奇
这是我的DataAccess类中的一个方法:
public static SQLiteConnection ConnectionManager
{
get
{
if (_con == null)
{
_con = new SQLiteConnection(@"Data Source=C:\TBM\Database\dev.db");
_con.Open();
SQLiteCommand command = new SQLiteCommand(sqlString, _con);
command.ExecuteNonQuery();
}
return _con;
}
}
我的连接总是打开的,因为对于每个具有单线程应用程序的sql命令,关闭它是没有意义的
更新:
public void AddPupil(int schoolclassCodeID, Pupil pupil)
{
using (SQLiteTransaction trans = DataAccess.ConnectionManager.BeginTransaction())
{
using (SQLiteCommand com = new SQLiteCommand(DataAccess.ConnectionManager))
{
com.Parameters.Add(new SQLiteParameter("@FirstName", pupil.FirstName));
com.Parameters.Add(new SQLiteParameter("@LastName", pupil.LastName));
com.Parameters.Add(new SQLiteParameter("@Gender", pupil.Gender));
com.Parameters.Add(new SQLiteParameter("@Street", pupil.Street));
com.Parameters.Add(new SQLiteParameter("@City", pupil.City));
com.Parameters.Add(new SQLiteParameter("@Postal", pupil.Postal));
com.Parameters.Add(new SQLiteParameter("@Phone", pupil.Phone));
com.Parameters.Add(new SQLiteParameter("@SchoolclassId", schoolclassCodeID));
com.CommandText = "INSERT INTO PUPIL (Firstname,LastName,Gender,Street,City,Postal,Phone,SchoolclassId_FK)" +
" VALUES(@FirstName,@LastName,@Gender,@Street,@City,@Postal,@Phone,@SchoolclassId)";
com.ExecuteNonQuery();
com.CommandText = "SELECT last_insert_rowid() as lastID";
pupil.Id = Convert.ToInt32(com.ExecuteScalar());
}
trans.Commit();
}
}
事务。当前的
将告诉您是否存在活动事务
只有在事务范围内打开连接后,它才会包含在事务中
HTHIIRC,
TransactionScope
与分布式事务协调器(MSDTC)紧密绑定。所以要注意,尤其是当您使用SQLite时
所有so都可以看到关于so的许多其他问题,例如..当我查看当前事务和事务信息时,我看到了事务的CreateTime,2小时前我刚刚在visual studio中运行我的应用程序。看来我的TransactionScope不起作用了,因为那时会有另一个时间。我这里有一个带有sqlite的STA应用程序和一个只有在应用程序关闭时才会关闭的单例连接。是什么导致该事务具有如此不现实的时间?在这种情况下,TransactionScope将不起作用。您必须打开范围内的连接;否则它就不知道了。打开然后为每个批处理处理一个连接确实没有什么错。您可以使用其他方法创建连接,并在“提供者”中使用创建的连接。正如abatishchev提供的链接所提到的:如果在范围内创建另一个连接,事务可能会升级为分布式事务——这取决于SQLite的工作方式(我根本不知道)。祝你好运:)@Eben然后解释一下=>当我在数据提供程序中执行第一个Delete方法时,直到调用trans.commit()时,数据才被删除。当第二个delete方法抛出一个provokated异常时,第一个delete语句也不会执行。因此,我想交易必须/应该有效。你觉得怎么样?这很奇怪。您是否未在“*提供程序”中使用显式事务?要么在第一次调用中创建了该连接,要么在第一次调用中创建了单例连接,在这种情况下,它将成为事务作用域事务的一部分。@Eben我从数据提供程序类中删除了所有显式SQLiteTransaction。现在,我的服务类在任何地方都使用Transactionscope来创建、删除和更新方法。我现在发现的是:。。。。。。。。。。1.)当我第一次使用(var trans=new TransactionScope())调用时,在该TransactionScope中,我在dataprovider中执行了两个delete方法,每个方法都在执行DataAccess.ConnectionManager以获取连接,然后Transaction.Current不为null。您向我抛出的链接与我对Sqlite的链接完全没有帮助。。。如我所写的STA应用程序。TransactionScope仅在需要第二次连接(SQL2005)或需要在其他数据库/资源上进行第二次连接(SQL 2008)时才会升级为分布式@nonnb:您有任何链接要确认吗?非常有趣。您的链接()确认了不必要的2005升级。当ACID事务(如here)中涉及多个资源管理器(如SQL和MSMQ)时,就需要DTC。