By default web2py stores tickets (errors) on the local file system. This is because most of the tickets are caused by database failures. Anyway You can move the tickets to a database by creating a script like:
import os, time, stat, datetime
from gluon.restricted import RestrictedErro()
db=SQLDB('postgres....')
db.define_table('ticket',
SQLField('name'),
SQLField('date_saved','datetime'),
SQLField('layer'),
SQLField('traceback','text'),
SQLField('code','text'))
path='applications/yourapp/errors/'
while 1:
for file in os.listdit(path):
e=RestrictedError()
e.load(path+file)
t=datetime.fromtimestamp(os.stat(path+file)[stat.ST_MTIME])
db.ticket.insert(date_saved=t,name=file,layer=e.layer,traceback=e.traceback,code=e.code)
os.unlink(path+file)
db.commit()
time.sleep(300)
and run it with
python web2py.py -S yourapp -M -R yourscript.py
This is just an example.
No concurrency problems because tickets would always be stored locally and in db moved every 5 minutes.
This solution decauples the problem of storing a ticket in case of database failure from your app that would create meta-tickets