# Validación de acceso concurrente

**URL:** https://discuss.tryton.org/t/validacion-de-acceso-concurrente/1440
**Category:** Developer
**Created:** [June 5, 2019, 2:00am UTC](https://discuss.tryton.org/t/validacion-de-acceso-concurrente/1440 "2019-06-05T02:00:20Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![fsanchez](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/f/3d9bf3/32.png) [@fsanchez](https://discuss.tryton.org/u/fsanchez)
#### Post date: [June 5, 2019, 2:00am UTC](https://discuss.tryton.org/t/validacion-de-acceso-concurrente/1440/1 "2019-06-05T02:00:20Z")

</div>

Estoy trabajando sobre un modulo que hecha una programación de turnos para citas medicas, se ofrecen los turnos en venta, sucede que dos cajeras pueden tomar el mismo turno simultáneamente, y las 2 llegan a terminar la venta pero el turno queda con el nombre del ultimo paciente que realizo la compra. De que manera se puede controlar que el turno ya vendido a una persona, no pueda ser vendido a otra persona cuando la transacción se realice en simultaneo. Si alguien me da algún alcance estaré agradecido. O algun modulo del core donde se utilice esa validación.  
Saludos

---

<div class="post-metadata">

### Author: ![sergyo](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/sergyo/32/181_2.png) [@sergyo](https://discuss.tryton.org/u/sergyo)
#### Post date: [June 5, 2019, 7:07am UTC](https://discuss.tryton.org/t/validacion-de-acceso-concurrente/1440/2 "2019-06-05T07:07:53Z")

</div>

Puedes hacer [un bloqueo a nivel de tabla](http://hg.tryton.org/modules/account/file/default/fiscalyear.py#l285) para asegurar que no hay 2 usuarios/sesiones intentando acceder al mismo turno.

---

<div class="post-metadata">

### Author: ![ced](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/ced/32/1237_2.png) [@ced](https://discuss.tryton.org/u/ced)
#### Post date: [June 5, 2019, 8:04am UTC](https://discuss.tryton.org/t/validacion-de-acceso-concurrente/1440/3 "2019-06-05T08:04:31Z")

</div>

By default Tryton uses [repeatable read](https://www.postgresql.org/docs/current/transaction-iso.html#XACT-REPEATABLE-READ) transaction isolation.  
Also in recent version, there is the Database.lock\_id which allows to lock only an id instead of the all table.

---

<div class="post-metadata">

### Author: ![mono](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/mono/32/289_2.png) [@mono](https://discuss.tryton.org/u/mono)
#### Post date: [June 6, 2019, 6:07pm UTC](https://discuss.tryton.org/t/validacion-de-acceso-concurrente/1440/4 "2019-06-06T18:07:58Z")

</div>

> [@fsanchez](#):
>
> el turno queda con el nombre del ultimo paciente que realizo la compra

Creo que el problema es como esta modelado los horarios y los pacientes que lo compran.  
A mi modo de ver las 2 cajeras no estan asignando un paciente a un horario sino editando un campo del horario.

si existiera un modelo intermedio simplemente aplica un constraint e impediría que se repita el horario y a la última cajera le saldría mensaje de error e impediría asignar ese horario.

sería algo así:

```
HorarioPaciente ():
    __name__ = 'modulo.paciente.horario'
    paciente = fields.Many2One('modulo.paciente', 'Paciente')
    horario = fields.Many2One('modulo.horario', 'Horario')

    @classmethod
        def __setup__ (cls):
            super(HorarioPaciente, cls). __setup__ ()
            table = cls. __table__ ()
            cls._sql_constraints += [
            ('unique_horario', Unique(table, table.horario),
                'El Horario debe ser unico')
            ]

```
