visual studio microsoft descargar community c# sqlite3 system.data.sqlite

c# - studio - Obtener la última ID insertada



microsoft visual studio descargar (2)

Actualmente estoy usando el método a continuación para obtener el ID de la última fila insertada.

Database.ExecuteNonQuery(query, parameters); //if another client/connection inserts a record at this time, //could the line below return the incorrect row ID? int fileid = Convert.ToInt32(Database.Scalar("SELECT last_insert_rowid()")); return fileid;

Este método ha estado funcionando bien hasta el momento, pero no estoy seguro de que sea completamente confiable.

Supongamos que hay dos aplicaciones de cliente, cada una con sus propias conexiones de base de datos separadas, que invocan el método del lado del servidor anterior exactamente al mismo tiempo. Teniendo en cuenta que los hilos del cliente se ejecutan en paralelo y que SQLite solo puede ejecutar una operación a la vez (o eso he escuchado), ¿sería posible que una instancia del cliente devuelva el ID de fila de un registro insertado por la otra instancia?

Por último, ¿hay una forma mejor de obtener la última identificación de fila insertada?


Si otro cliente / conexión inserta un registro en este momento, ¿podría la línea a continuación devolver la identificación incorrecta de la fila?

No, ya que la escritura ocurrirá después de la lectura, o antes de la lectura, pero no durante la lectura.

Teniendo en cuenta que los hilos del cliente se ejecutan en paralelo y que SQLite solo puede ejecutar una operación a la vez, ¿podría un cliente obtener el ID de fila del registro insertado por el otro cliente?

Sí, por supuesto.

No importa que los métodos del lado del servidor se invoquen exactamente al mismo tiempo. El bloqueo de la base de datos permite lecturas concurrentes, aunque no escrituras concurrentes, o lee durante la escritura.

si aún no lo hizo, lea el modelo de bloqueo de archivos de SQLite .


Si tanto el comando de inserción como el último comando insert row id están dentro del mismo bloqueo de escritura y ningún otro comando de inserción en ese bloqueo de escritura puede ejecutarse entre esos dos comandos, entonces estás a salvo.

Si inicia el bloqueo de escritura después del comando de inserción, entonces no hay forma de asegurarse de que otro subproceso no tenga primero un bloqueo de escritura. Si otro hilo obtuvo primero un bloqueo de escritura, entonces no podrá ejecutar una búsqueda para el ID de fila hasta que ese otro hilo haya liberado su bloqueo. Para entonces, podría ser demasiado tarde si el otro hilo insertó una nueva fila.