import sqlite3 import shutil import os import time #import threading import multiprocessing import subprocess DBNAME = 'Dummy.db' # def test_transaction_lock(pname, copyfile_fn, wait_time=2.0): db_conn = sqlite3.connect(DBNAME) try: db_conn.execute('begin EXCLUSIVE transaction') print pname, ": Transaction lock acquired" copyfile_fn(DBNAME, DBNAME+'.snapshot') time.sleep(wait_time) finally: db_conn.rollback() print name, ": Transaction lock released" db_conn.close() # # Copy a file with built-in function open (in shutil.copyfile) # def shutil_copyfile(*args, **kwargs): shutil.copyfile(*args, **kwargs) # # Copy a file with os.open # def low_copyfile(src, dst): ifd = os.open(src, os.O_RDONLY) ofd = os.open(dst, os.O_RDWR | os.O_CREAT) while 1: buf = os.read(ifd, 4096) if not buf: break os.write(ofd, buf) # # Copy a file with cp command # def command_copyfile(src, dst): subprocess.call(['cp', src, dst]) ## ## main ## for copyfile_fn in (shutil_copyfile, low_copyfile, command_copyfile): print 'Use %s' % (copyfile_fn,) for name in ('process-1', 'process-2'): proc = multiprocessing.Process( target=test_transaction_lock, args=(name, copyfile_fn)) proc.start() time.sleep(1.0) time.sleep(3.0) print