import sqlite3
import time
from pathlib import Path
from multiprocessing import Process

db_path = Path('./db.sqlite3')


def main():
    setup_db()
    p1 = Process(target=run_transaction)
    p2 = Process(target=run_transaction)
    p1.start()
    p2.start()
    p1.join()
    p2.join()


def run_transaction():
    mode = '' # equivalent to 'deferred' (default value).
    # mode = 'immediate' # this will work
    # mode = 'exclusive' # this will work too
    db = sqlite3.connect(db_path)
    db.execute(f'begin {mode} transaction')
    db.execute('select 0 from t')
    db.execute('insert into t values (0)')
    time.sleep(1)
    db.execute('end')


def setup_db():
    db_path.unlink(missing_ok=True)
    db = sqlite3.connect(db_path)
    db.executescript('''create table t(c int)''')
    db.commit()


if __name__ == '__main__':
    main()
