Hi all,

I'm using Python 2.5.1 with SqlAlchemy 0.5rc2 with Sqlite on Windows
Server 2003 and I'm having a problem with my application throwing
InvalidRequestError and ConcurrentModification exceptions. Here is my
simplified declarative class:

class Job(srsmanagerdb.Base):
    STATUS_INIT = 0
    STATUS_RUN = 1
    STATUS_DONE = 2
    STATUS_FAIL = 3
    __tablename__ = "jobs"
    id            = Column(Integer, primary_key=True,
autoincrement=True)
    nas           = Column(String(12), default=None)
    filename      = Column(String(64), default=None, index=True)
    filesize      = Column(Integer, default=None)
    created       = Column(DateTime, default=None)
    job_id        = Column(String(32), default=None)
    productType   = Column(String(1), default=None)
    contentType   = Column(String(10), default=None)
    priorityType  = Column(String(10), default=None)
    priority      = Column(Integer, default=None)
    assignedPress = Column(Integer, default=None)
    status        = Column(Integer, default=None)
         
    def __init__(self, objrefs, fileDetails):
        nas, filename, filesize, ctime = fileDetails
        self.nas = nas
        self.filename = filename
        self.filesize = filesize
        self.created =
datetime.datetime(*time.strptime(ctime[:ctime.find(".")], "%Y-%m-%d
%H:%M:%S")[0:6])

This object is used to track state information about jobs being handled
by a looping state machine. I keep a list of all active jobs in a Jobs
collection class, so there are many active intances of the above class.
The simplified Jobs collection class looks like this:

class Jobs(AppContext):
    def __init__(self, objrefs):
        self._logger = __logger__
        self._jobs = []
        self._markedForRemoval = []
    def markForRemoval(self, job):
        self._markedForRemoval.append(job)
    def removeMarkedJobs(self):                  # throws exception in
here
        session = srsmanagerdb.Session()
        for markedJob in self._markedForRemoval:
            try:
                session.expire_all()
                session.delete(markedJob)
                session.commit()
                self._jobs.remove(markedJob)
            except sqlalchemy.exceptions.ConcurrentModificationError, e:
                self._logger.warn("%s threw exception %s" %
(job.filename, e))
        self._markedForRemoval = []
    def process(self):
          for job for self._jobs:
            job.process()
        if job.status == Job.STATUS_DONE:
            self.markForRemoval(job)
        self.removeMarkedJobs()

The above simplified code runs for awhile (10s of minutes) with hundreds
of jobs and then it throws the exception below in the removeMarkedJobs()
method. I've worked really hard trying to figure out what's going wrong
here. This is the only place where I delete jobs and commit that delete
to the database. One question I have is if it's a good idea to keep a
list of active Job instances (database rows) in a Python list. In my
removeMarkedJobs() I'm deleting the job instances, and then removing the
job instance from the list. Is this necessary or good practice? I
haven't figured out if just deleting the job instance from the list
(self._jobs.remove(markedJob)) will also delete the job from the
database or not. Anyway, here's the traceback of the exception I'm
getting. Any help would be appreciated.

Thanks, Doug

2008-10-27 18:15:54 srsmanager   ERROR    unexpected error, restarting:
Traceback (most recent call last):   
File "c:\cygwin\home\ripadmin\dev\srsmanager\srsprocess.py", line 154,
in runjobs     isActive = self._jobs.process()   
File "c:\cygwin\home\ripadmin\dev\srsmanager\jobs.py", line 436, in
process     self.removeMarkedJobs()   
File "c:\cygwin\home\ripadmin\dev\srsmanager\jobs.py", line 397, in
removeMarkedJobs     self._logger.warn("%s threw exception %s" %
(markedJob.filename, e))   
File
"c:\python\2.5\lib\site-packages\SQLAlchemy-0.5.0rc1-py2.5.egg\sqlalchem
y\orm\attributes.py", line 135, in __get__     return
self.impl.get(instance_state(instance))   
File
"c:\python\2.5\lib\site-packages\SQLAlchemy-0.5.0rc1-py2.5.egg\sqlalchem
y\orm\attributes.py", line 327, in get     value = callable_()   
File
"c:\python\2.5\lib\site-packages\SQLAlchemy-0.5.0rc1-py2.5.egg\sqlalchem
y\orm\attributes.py", line 909, in __call__     attr.impl.key in
unmodified   
File
"c:\python\2.5\lib\site-packages\SQLAlchemy-0.5.0rc1-py2.5.egg\sqlalchem
y\orm\mapper.py", line 1715, in _load_scalar_attributes     result =
session.query(mapper)._get(identity_key, refresh_state=state,
only_load_props=attribute_names)   
File
"c:\python\2.5\lib\site-packages\SQLAlchemy-0.5.0rc1-py2.5.egg\sqlalchem
y\orm\query.py", line 1211, in _get     return q.all()[0]   
File
"c:\python\2.5\lib\site-packages\SQLAlchemy-0.5.0rc1-py2.5.egg\sqlalchem
y\orm\query.py", line 985, in all     return list(self)   
File
"c:\python\2.5\lib\site-packages\SQLAlchemy-0.5.0rc1-py2.5.egg\sqlalchem
y\orm\query.py", line 1073, in __iter__     return
self._execute_and_instances(context)   
File
"c:\python\2.5\lib\site-packages\SQLAlchemy-0.5.0rc1-py2.5.egg\sqlalchem
y\orm\query.py", line 1076, in _execute_and_instances     result =
self.session.execute(querycontext.statement, params=self._params,
mapper=self._mapper_zero_or_none(), _state=self._refresh_state)   
File
"c:\python\2.5\lib\site-packages\SQLAlchemy-0.5.0rc1-py2.5.egg\sqlalchem
y\orm\session.py", line 750, in execute     return
self.__connection(engine, close_with_result=True).execute(   File
"c:\python\2.5\lib\site-packages\SQLAlchemy-0.5.0rc1-py2.5.egg\sqlalchem
y\orm\session.py", line 717, in __connection     return
self.transaction._connection_for_bind(engine)   
File
"c:\python\2.5\lib\site-packages\SQLAlchemy-0.5.0rc1-py2.5.egg\sqlalchem
y\orm\session.py", line 309, in _connection_for_bind
self._assert_is_active()   
File
"c:\python\2.5\lib\site-packages\SQLAlchemy-0.5.0rc1-py2.5.egg\sqlalchem
y\orm\session.py", line 244, in _assert_is_active     "The transaction
is inactive due to a rollback in a " InvalidRequestError: The
transaction is inactive due to a rollback in a subtransaction.  Issue
rollback() to cancel the transaction

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to