rorm icon indicating copy to clipboard operation
rorm copied to clipboard

SQLite transactions potentially not committing properly

Open WebFreak001 opened this issue 3 years ago • 1 comments

I had performed some operations in a transaction which I then committed (inside the transaction I could also query the rows I just inserted), however after having committed the transaction (through DORM / rorm-lib), nothing was actually written to disk. The data was also not there when the app finished.

Got it reproducing. When just using db instead of a transaction, the data gets written to disk properly.

rorm-lib call trace
[trace] (void) rorm_db_query_optional(
        DBHandle@1447099D0, 
        DBTransactionHandle@0, 
        facility, 
        [const(FFIColumnSelector)(facility, id, __id), const(FFIColumnSelector)(facility, admin, __admin), const(FFIColumnSelector)(facility, timezone, __timezone), const(FFIColumnSelector)(facility, default_group_cron, __default_group_cron), const(FFIColumnSelector)(facility, default_group_feature_interval, __default_group_feature_interval)], 
        [], 
        (no condition), 
        [], 
        0, 
        extern (C) void(void*, scope DBRowHandle, scope RormError)@1001430DC, 
        void@16FD96660
)
[trace] Callback success: DBRowHandle@0
[trace] (void) rorm_db_start_transaction(
        const(DBHandle)@1447099D0, 
        extern (C) void(void*, DBTransactionHandle, scope RormError)@10030A514, 
        void@16FD96BA8
)
[trace] Callback success: DBTransactionHandle@1447183C0
[trace] (void) rorm_db_insert(
        DBHandle@1447099D0, 
        DBTransactionHandle@1447183C0, 
        facility, 
        [id, admin, timezone, default_group_cron, default_group_feature_interval], 
        [FFIValue(0), FFIValue(null), FFIValue("Europe/Berlin"), FFIValue(null), FFIValue(null)], 
        extern (C) void(void*, scope RormError)@10014B19C, 
        void@16FD96500
)
[trace] Callback success
[trace] (void) rorm_db_insert(
        DBHandle@1447099D0, 
        DBTransactionHandle@1447183C0, 
        user, 
        [name, facility], 
        [FFIValue("superadmin"), FFIValue(0)], 
        extern (C) void(void*, scope RormError)@10014B19C, 
        void@16FD96750
)
[trace] Callback success
[trace] (void) rorm_db_query_one(
        DBHandle@1447099D0, 
        DBTransactionHandle@1447183C0, 
        user, 
        [const(FFIColumnSelector)(user, id, __id), const(FFIColumnSelector)(user, name, __name), const(FFIColumnSelector)(user, facility, __facility), const(FFIColumnSelector)(user, karma, __karma), const(FFIColumnSelector)(user, enabled, __enabled), const(FFIColumnSelector)(user, created_at, __created_at)], 
        [], 
        (no condition), 
        [], 
        0, 
        extern (C) void(void*, scope DBRowHandle, scope RormError)@1001430DC, 
        void@16FD965F0
)
[trace] Callback success: DBRowHandle@144717B90
[trace] #0 rorm_row_get_i64 (
        DBRowHandle@144717B90, 
        __id, 
        RormError(NoError, #{overlap runtime_error, configuration_error, database_error})
)
[trace] #0 -> returned 1
[trace] #1 rorm_row_get_str (
        DBRowHandle@144717B90, 
        __name, 
        RormError(NoError, #{overlap runtime_error, configuration_error, database_error})
)
[trace] #1 -> returned superadmin
[trace] #2 rorm_row_get_i64 (
        DBRowHandle@144717B90, 
        __facility, 
        RormError(NoError, #{overlap runtime_error, configuration_error, database_error})
)
[trace] #2 -> returned 0
[trace] #3 rorm_row_get_i64 (
        DBRowHandle@144717B90, 
        __karma, 
        RormError(NoError, #{overlap runtime_error, configuration_error, database_error})
)
[trace] #3 -> returned 0
[trace] #4 rorm_row_get_bool (
        DBRowHandle@144717B90, 
        __enabled, 
        RormError(NoError, #{overlap runtime_error, configuration_error, database_error})
)
[trace] #4 -> returned true
[trace] #5 rorm_row_get_datetime (
        DBRowHandle@144717B90, 
        __created_at, 
        RormError(NoError, #{overlap runtime_error, configuration_error, database_error})
)
[trace] #5 -> returned FFIDateTime(2022, 12, 1, 12, 6, 28)
[trace] (void) rorm_db_update(
        const(DBHandle)@1447099D0, 
        DBTransactionHandle@1447183C0, 
        facility, 
        [const(FFIUpdate)(admin, FFIValue(1))], 
        (no condition), 
        extern (C) void(void*, ulong, scope RormError)@1001668CC, 
        void@16FD96BA8
)
[trace] Callback success: 1
[trace] (void) rorm_transaction_commit(
        DBTransactionHandle@1447183C0, 
        extern (C) void(void*, scope RormError)@10014B19C, 
        void@16FD96BB0
)
[trace] Callback success
[trace] (void) rorm_db_query_stream(
        DBHandle@1447099D0, 
        DBTransactionHandle@0, 
        facility, 
        [const(FFIColumnSelector)(facility, id, __id), const(FFIColumnSelector)(facility, admin, __admin), const(FFIColumnSelector)(facility, timezone, __timezone), const(FFIColumnSelector)(facility, default_group_cron, __default_group_cron), const(FFIColumnSelector)(facility, default_group_feature_interval, __default_group_feature_interval)], 
        [], 
        (no condition), 
        [], 
        Nullable.null, 
        extern (C) void(void*, DBStreamHandle, scope RormError)@10016700C, 
        void@16FD96108
)
[trace] Sync Callback success: DBStreamHandle@1446105F0
[trace] (void) rorm_stream_get_row(
        DBStreamHandle@1446105F0, 
        nothrow extern (C) void(void*, DBRowHandle, scope RormError)@100167BB8, 
        void@16FD96D98
)
[trace] (void) rorm_stream_free(
        DBStreamHandle@1446105F0
)

WebFreak001 avatar Dec 01 '22 12:12 WebFreak001

rorm-db now exposes a close method on Database once exposed to rorm-lib this might fix the issue

gammelalf avatar Sep 06 '23 15:09 gammelalf