C# 我可以在业务层使用TransactionScope而不是在数据提供程序中使用SQLiteTransaction吗?

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

我想在我的业务层中使用TransactionScope类:

在AdminService类中:

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();               
            }
        }

事务。当前的
将告诉您是否存在活动事务

只有在事务范围内打开连接后,它才会包含在事务中


HTH

IIRC,
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。