@Anthony
If I try for_update=True in the 1st SELECT I get this error 
sqlite3.OperationalError: near "FOR": syntax error.
My original code
row = db.wo_counter(year_=request.now.year)

My interpretation of your suggestion
row = db(db.wo_counter.year_ == request.now.year).select(
    db.wo_counter.year_, db.wo_counter.last_assigned, for_update=True).first
()

The error I get
  File "C:\web2py\applications\ajc\controllers/open_wo.py", line 319, in 
new_par
t2
    db.wo_counter.year_, db.wo_counter.last_assigned, for_update=True).first
()
  File "C:\web2py\gluon\packages\dal\pydal\objects.py", line 2378, in select
    return adapter.select(self.query, fields, attributes)
  File "C:\web2py\gluon\packages\dal\pydal\adapters\sqlite.py", line 82, in 
sele
ct
    return super(SQLite, self).select(query, fields, attributes)
  File "C:\web2py\gluon\packages\dal\pydal\adapters\base.py", line 763, in 
selec
t
    return self._select_aux(sql, fields, attributes, colnames)
  File "C:\web2py\gluon\packages\dal\pydal\adapters\base.py", line 719, in 
_sele
ct_aux
    rows = self._select_aux_execute(sql)
  File "C:\web2py\gluon\packages\dal\pydal\adapters\base.py", line 713, in 
_sele
ct_aux_execute
    self.execute(sql)
  File "C:\web2py\gluon\packages\dal\pydal\adapters\__init__.py", line 66, 
in wr
ap
    return f(*args, **kwargs)
  File "C:\web2py\gluon\packages\dal\pydal\adapters\base.py", line 413, in 
execu
te
    rv = self.cursor.execute(command, *args[1:], **kwargs)
sqlite3.OperationalError: near "FOR": syntax error

If I remove the for_update=True from the 1st SELECT and add it to the 2nd I 
get a different error sqlite3.OperationalError: cannot start a transaction 
within a transaction.
My original code
        sn_counter_id = db.equipment(session.new_form_part1.equipment_id).
sn_counter_id

My interpretation of your suggestion
        sn_counter_id = db(db.equipment.id == session.new_form_part1.
equipment_id).select(db.equipment.sn_counter_id, for_update=True).first().
sn_counter_id

The error I get
ERROR:web2py:Traceback (most recent call last):
  File "C:\web2py\gluon\restricted.py", line 219, in restricted
    exec(ccode, environment)
  File "C:\web2py\applications\ajc\controllers/open_wo.py", line 708, in <
module
>
  File "C:\web2py\gluon\globals.py", line 421, in <lambda>
    self._caller = lambda f: f()
  File "C:\web2py\gluon\tools.py", line 3868, in f
    return action(*a, **b)
  File "C:\web2py\applications\ajc\controllers/open_wo.py", line 331, in 
new_par
t2
    ).select(db.equipment.sn_counter_id, for_update=True).first().
sn_counter_id
  File "C:\web2py\gluon\packages\dal\pydal\objects.py", line 2378, in select
    return adapter.select(self.query, fields, attributes)
  File "C:\web2py\gluon\packages\dal\pydal\adapters\sqlite.py", line 81, in 
sele
ct
    self.execute('BEGIN IMMEDIATE TRANSACTION;')
  File "C:\web2py\gluon\packages\dal\pydal\adapters\__init__.py", line 66, 
in wr
ap
    return f(*args, **kwargs)
  File "C:\web2py\gluon\packages\dal\pydal\adapters\base.py", line 413, in 
execu
te
    rv = self.cursor.execute(command, *args[1:], **kwargs)
sqlite3.OperationalError: cannot start a transaction within a transaction


If I remove the for_update=True everything works either with my original 
code and with the changes made to be able to add the for_update=True.

I'm confused regarding the 1st error.

The 2nd error might be because there is already an implicit transaction 
from web2py itself?

I'm using SQLite.


quinta-feira, 21 de Março de 2019 às 15:36:56 UTC, Anthony escreveu:
>
> On Wednesday, March 20, 2019 at 9:56:11 PM UTC-4, João Matos wrote:
>>
>> What I read about the commit/rollback "wrapping" that web2py does, it 
>> doesn't seem to solve my problem.
>>
>> Let me explain.
>> I have 3 tables (sn_counter, wo_counter and wo).
>> The procedure I must do is the following:
>> 1. Get the record from wo_counter table a extract the counter value (read 
>> operation), let's suppose I get the number 10.
>>
>
> At this step, you can lock this particular wo_counter record using 
> for_update:
>
> row = db(query).select(db.wo_counter.counter, for_update=True).first()
>
> The above will (a) wait until the relevant rows are unlocked via a similar 
> query in another request before doing the select and then (b) lock the 
> relevant rows until the current transaction is complete. So, once you've 
> read the counter value, you can proceed with the rest of the transaction 
> without worrying about other requests making intervening changes.
>
> Anthony
>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to