Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Bloqueo Optimista (https://www.clubdelphi.com/foros/showthread.php?t=23403)

Leonardo 15-07-2005 17:25:24

Bloqueo Optimista
 
Que tal estoy tabajando con Delphi7 y FireBird 1.5, lei acerca de que este los RDBMS manejanban los bloqueos optimista por si solo (O tal vez estoy mal),

La cosa es que he he probado con una aplicacion sencilla para probar esto, solo un Grid y un datanavigator, corro 2 aplicaciones de estas y empiezo a editar un registro en mi primera aplicacion, en la segunda empiezo a editar el mismo registro que la primera aplicacion, Grabo los cambios en la primera aplicacion y despues pruebo grabar en la segunda aplicacion y se graban se supone que en esta parte deberia haber un mensaje de que los cambios no pueden ser grabados debido a que en registro ya ha sido modificado.

Quisiera saber como poder lograr el bloqueo optimista realmente es algo de mis configuraciones de mis controles pork he probado con los IBObjects y con FIBPlus y no he logrado conseguuirlo,

Me gustaria mucho que me pudieran orientar en como poder lograr esto Gracias.

Casimiro Notevi 15-07-2005 17:48:36

en el libro de Ian Marteens tienes una explicación bastante clara, creo que te puede venir bien el leer esa parte Ian Marteens

Leonardo 19-07-2005 16:13:39

oK casimiro lei esa parte de los blokeos del libro la cara oculta de delphi 4, y si menciona que Interbase hace por si solo el blokeo optimista a traves de su arquitectura , no creo que tenga que ver que yo utilizo Firebird 1.5 ya que firerbird viene de Interbase. Hice una prueba iinstalando un driver ODBC para Firebird y utilize los componentes ADO los cuales tienen una proiedad "Lock Tpe" y ahi es don de yo selecciono la optimista y pruebo el programita que hice y si funciona, pero obviamente no seria lo optimo trabajar con a traves de ODBC es por eso que tengo esa duda sobre si hay que configurar algo en los FIBPLUS o en los IBOBJECTS ya que corro el programa utilizando estos componentes y no ocurre ninguna excepcion..

De cualquier modo tratare de hacer la prueba utilizando Interbase en vez de Firebird.

Casimiro Notevi 19-07-2005 23:09:46

No entiendo bien qué quiéres decir, ¿usas ADO, IBObjcets, FIBplus?, no entiendo. :confused:

Leonardo 20-07-2005 01:26:32

Si mira hice las pruebas utilizando independientemente cada uno de estos componentes con el los unicos que logre k ocurriera se diera la excepcion de que existia el blokeo optimista fue con los ADO atraves de un driver ODBC que instale para poder utilizar los ADO

Rufus 20-07-2005 10:38:19

Cita:

Empezado por Leonardo
La cosa es que he he probado con una aplicacion sencilla para probar esto, solo un Grid y un datanavigator, corro 2 aplicaciones de estas y empiezo a editar un registro en mi primera aplicacion, en la segunda empiezo a editar el mismo registro que la primera aplicacion, Grabo los cambios en la primera aplicacion y despues pruebo grabar en la segunda aplicacion y se graban

Correcto, así es justo como tiene que comportarse con IBX o FIBPlus si dejas las transacciones con los parámetros por defecto.

Creo que no tienes claro qué significa bloqueo optimista.
  • Bloqueo optimista: cuando una transacción está modificando los datos de un registro no bloquea a las otras transacciones que quieren leer ese registro, las cuales pueden seguir viendo la versión de antes de que empezara la modificación. RESUMIENDO: los escritores no bloquean a los lectores.
  • Bloqueo pesimista: cuando una transacción está modificando los datos de un registro, bloquea a las otras transacciones que quieren leer ese registro, las cuales obtienen una excepción. En algunos sistemas el bloqueo puede llegar al nivel de la tabla entera. RESUMIENDO: los escritores bloquean a los lectores.
Ahora bien, tu planteas el caso de dos transacciones que quieren escribir (modificar) el mismo registro al mismo tiempo. ....Aaaaaamigo, eso es otra cosa, digamos que es algo que va más allá de que el bloqueo sea optimista, y el comportamiento a segir, pues depende, como verás ahora.

Primero, aqui tienes el manual de kinobi sobre transacciones en firebird: http://www.terra.es/personal2/jrodri...ones-0.2.6.pdf

Y ahora te paso lo que pone el manual de los FIBPlus 5.3 sobre los parámetros de las transacciones:
--------------------------------------------------------------------------
Using the transaction parameter buffer

The transaction parameter buffer (TPB) is an optional byte vector, passed to InterBase by StartTransaction procedure, that sets up a transaction’ attributes, its operating characteristics, such as whether the transaction has read and write access to tables, or read-only access, and whether or not other simultaneously active transactions can share table access with the transaction.

The following table lists some available
TPB constants:



isc_tpb_version3 InterBase version 3 transaction.

isc_tpb_consistency Table-locking transaction model. This model is serializable.

isc_tpb_concurrency High throughput, high concurrency transaction with repeatable read consistency. This mode takes full advantage of the InterBase multigenerational transaction model [Default].

isc_tpb_shared Concurrent, shared access of a specified table among all transactions; use in conjunction with isc_tpb_lock_read and isc_tpb_lock_write to establish the lock option [Default].

isc_tpb_protected Concurrent, restricted access of a specified table; use in conjunction with isc_tpb_lock_read and isc_tpb_lock_write to establish the lock option.

isc_tpb_wait Specifies that the transaction is to wait until the conflicting resource is released before retrying an operation [Default].

isc_tpb_nowait Specifies that the transaction is not to wait for the resource to be released, but instead, an update conflict error should be returned immediately.

isc_tpb_read Read-only access mode that allows a transaction only to select data from tables.

isc_tpb_write Read-write access mode of that allows a transaction to select, insert, update, and delete table data [Default].isc_tpb_lock_read Read-only access of a specified table. Use in conjunction with isc_tpb_shared, isc_tpb_protected, and isc_tpb_exclusive to establish the lock option.

isc_tpb_lock_write Read-write access of a specified table. Use in conjunction with isc_tpb_shared,

isc_tpb_protected, and isc_tpb_exclusive to establish the lock option [Default].

isc_tpb_read_committed High throughput, high concurrency transaction that can read changes committed by other concurrent transactions. Transactions in this mode do not provide repeatable read.

isc_tpb_rec_version Enables an isc_tpb_read_committed transaction to read the most recently committed version of a record even if other, uncommitted versions are pending.

isc_tpb_no_rec_version Enables an isc_tpb_read_committed transaction to read only the latest committed version of a record. If an uncommitted version of a record is pending and isc_tpb_wait is also specified, then the transaction waits for the pending record to be committed or rolled back before proceeding. Otherwise, a lock conflict error is reported at once.

You can access the transaction parameter buffer by TPB property.
--------------------------------------------------------------------------

Ahora, un ejemplo (probado):

- Abro dos ventanas de terminal y me conecto a una BD con isql.
- En las dos ventanas tecleo lo siguiente: set transaction read write no wait isolation level read committed no record_version;
- En la primera ventana tecleo: update clientes set id=2 where id=2; resultado: nada, así que no hay problema.
- Ahora, en la segunda ventana tecleo lo mismo: update clientes set id=2 where id=2; resultado:
Statement failed, SQLCODE = -901

lock conflict on no wait transaction
-deadlock

¿Es esto lo que buscas?... ya sabes, cámbia los parámetros de las transacciones. ¿Como? Tenías un programita con grid y navigator ¿no?. Entonces para IBX:

- Haz doble click sobre el componente TIBTransaction que tendrás por ahí.
- Aparece una ventana "Transaction editor", en el lado de la izquierda pica sobre "Read Committed".
- En el lado de la derecha aparece "read_commited", "rec_version" y "nowait". Sustituye a mano "rec_version" por "no_rec_version", dale a OK.
- Prueba ahora. Ejecuta dos veces tu programita.

PD: El libro de Marteens descargable de internet (la cara oculta de delphi 4) estuvo muy bien en su época (yo lo compré en su día y aún lo tengo)pero ahora, al igual que el BDE, se ha quedado atrás.

Leonardo 20-07-2005 20:02:02

Tenias mucha razon amigo asi me funciono ya, pero al principio no me funcionaba y es que me di cuenta de que yo tenia Mi Dataset (FibDataset) con la propiedad Autocommit=True despues de que la modifique a False y si me funciono.

Mi pregunta es ahora, no hay manera de poder trabajar con la propiedad Autocommit=True y que el comportamiento de los bloqueos sean como anteriormente me dijiste tu,

Gracias Rufus el link de Trassacciones es muy bueno y viene muy bien esplicado, aunk aun sigo un poco confundido tendre k darle mas leidas y hacer mas pruebas

Leonardo 20-07-2005 21:40:32

Tenias razon amigo si funciono como me decias, solo que al principio no me funcionaba solo hasta que cambie la propiedad de mi dataset (FIBPlus) de Autocomit=true a False.

Solo que no habra la posibilidad de trabajar con la propiedad Autocomit=True ya que cuando esta en True los cambios se guardan sin que ourra ninguna exepcion y se graban los cambios del ultimo post.


La franja horaria es GMT +2. Ahora son las 15:01:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi