you *should* have one different db for each environment. Each scheduler tied to the same db will process incoming tasks, and it doesn't matter what app effectively pushes them.
This is good if you want to have a single scheduler (which can be composed by several workers) serving many apps, but *generally* you don't want to *merge* prod and beta apps.
The is_ticker bit is fine: only one worker tied to a db is elegible to be a ticker, which is the one process than manages asssigning tasks (to itself AND to other available workers).
Locking, once in a while, can happen and is self-healed. Continuous locking is not good: either you have too many workers tied to the db OR your db isn't processing concurrency at the rate that it needs.
SQLite can handle at most 2 or 3 workers. All the other "solid" backends can manage up to 10, 15 at most.
If you wanna go higher, you need to turn to the redis-backed scheduler.