Problem: gettxoutsetinfo, scantxoutset, and dumptxoutset retain LevelDB iterators after releasing cs_main.
While those iterators are live, AssumeUTXO cache rebalancing can call ResizeCache(), replace m_db, and cause LevelDB to abort.
The issue was [reported during review of #35465](https://github.com/bitcoin/bitcoin/pull/35465#discussion_r3428902672).
Fix: Each cursor holds a shared lock on m_db_mutex for its lifetime, while ResizeCache() takes the lock exclusively before replacing m_db.
ResizeCache() waits for active compaction before taking the exclusive lock, allowing cursors to remain live during compaction.
ResizeCache() holds cs_main while it waits, so a long-running UTXO scan can stall validation during cache rebalancing.
<details> <summary>Test failures without the fix</summary>
test/coins_tests.cpp:1090: error: in "coins_tests/coins_db_cursor_resize": check !CCoinsViewDBTestAccess::TryExclusiveLock(db) has failed
test/coins_tests.cpp:1102: error: in "coins_tests/coins_db_cursor_resize": check status == std::future_status::timeout has failed [0 != 1]
</details>