mbdavid / LiteDB

LiteDB - A .NET NoSQL Document Store in a single data file
http://www.litedb.org
MIT License
8.36k stars 1.22k forks source link

[BUG] Current transaction contains open cursors. Close cursors before run Commit() in 5.0.19 #2461

Closed dethknite closed 3 weeks ago

dethknite commented 3 months ago

Version: LiteDB v5.0.19

Describe the bug When processing through records to delete oldest, the following error is thrown: Current transaction contains open cursors. Close cursors before run Commit()

Code to Reproduce

using (var db = new LiteDatabase(connSharedReadWrite))
{
    // .... set min/max records and step
    long min=0, max=10000000;
    int step = 10000;
    long recordsToDelete = 250000;
    long recordsDeleted = 0;

    // Process
    while (min < max)
    {
        //Process each step..
        foreach (DbObject item in col.Find(Query.All("ObjectDateTime", Query.Ascending)).Skip(0).Take(step).ToArray())
        {
            //Delete Record
            col.Delete(BsonMapper.Global.Serialize(item)["_id"]);

            recordsDeleted+=1;
            if (recordsDeleted >= recordsToDelete)
                break;
        }

        if (recordsDeleted >= recordsToDelete)
            break;

        //Update position
        min += step;
    }
}

Expected behavior In v5.018 and lower, this functions as expected and deletes records.

alexbereznikov commented 3 months ago

It looks like the same issue as in #2440 and #2435 , #2436 change fixed it for us

JKamsker commented 3 weeks ago

Thank you for reporting this issue.

This issue has been resolved in the latest version of LiteDB. Please update to the latest version of LiteDB to resolve this issue. If the issue persists, please let us know.