2010-04-21 13 views
7

He hecho algunas búsquedas y también he leído las preguntas frecuentes en el sitio SQLite, no tuve suerte en encontrar una respuesta a mi pregunta.¿SQLite admite transacciones en múltiples bases de datos?

Podría ser que mi enfoque de base de datos sea defectuoso, pero en este momento, me gustaría almacenar mis datos en múltiples bases de datos SQLite3, por lo que significa archivos separados. Estoy muy preocupado por la corrupción de los datos debido a la posibilidad de que mi aplicación se bloquee, o por un corte de energía en medio de cambios de datos en mis tablas.

Con el fin de garantizar la integridad de los datos, que básicamente tienen que hacer esto:

begin transaction modificar mesa (s) en la base de datos # 1 modificar mesa (s) en la base de datos # 2 confirmar, o revertir si error

¿Es compatible con SQLite? Además, estoy usando sqlite.net, específicamente la última que se basa en SQLite 3.6.23.1.

ACTUALIZACIÓN

Una pregunta más - esto es algo que la gente suele añadir a sus pruebas de unidad? Siempre pruebo las bases de datos, pero nunca he tenido un caso como este. Y si es así, ¿cómo lo harías? Es casi como si tuviera que pasar otro parámetro al método como bool test_transaction, y si es cierto, lanzar una excepción entre los accesos a la base de datos. Luego, realice una prueba después de la llamada para asegurarse de que el primer conjunto de datos no haya ingresado en la otra base de datos. Pero tal vez esto es algo cubierto por las pruebas de SQLite, y debería no aparecer en mis casos de prueba.

+0

No creo que quiere añadir este a las pruebas unitarias. Es como si las transacciones funcionaran bien, no tiene sentido probarlas una y otra vez. Solo haga algunas pruebas iniciales para asegurarse de que las inserciones, actualizaciones, retrocesos, etc. sean correctas y que esté listo para continuar. –

+0

bien, pensé que sería lo mejor. ¡Perfecto! – Dave

Respuesta

11

Sí, las transacciones funcionan con diferentes bases de datos sqlite e incluso entre sqlite y sqlserver. Lo he intentado un par de veces.

Algunos enlaces e información

Desde aquí - Transaction between different data sources.

Desde SQLite ADO.NET 2.0 proveedor admite enlistement transacción, no sólo es posible llevar a cabo una transacción que abarca varias fuentes de datos SQLite, sino que también abarca otras bases de datos motores como SQL Server.

Ejemplo:

using (DbConnection cn1 = new SQLiteConnection(" ... ")) 
using (DbConnection cn2 = new SQLiteConnection(" ... ")) 
using (DbConnection cn3 = new System.Data.SqlClient.SqlConnection(" ... ")) 
using (TransactionScope ts = new TransactionScope()) 
{ 
    cn1.Open(); cn2.Open(); cn3.Open(); 
    DoWork1(cn1); 
    DoWork2(cn2); 
    DoWork3(cn3); 
    ts.Complete(); 
} 

Cómo fijar una nueva base de datos:

SQLiteConnection cnn = new SQLiteConnection("Data Source=C:\\myfirstdatabase.db"); 
cnn.Open(); 

using (DbCommand cmd = cnn.CreateCommand()) 
{ 
    cmd.CommandText = "ATTACH DATABASE 'c:\\myseconddatabase.db' AS [second]"; 
    cmd.ExecuteNonQuery(); 

cmd.CommandText = "SELECT COUNT(*) FROM main.myfirsttable INNER JOIN second.mysecondtable ON main.myfirsttable.id = second.mysecondtable.myfirstid"; 


    object o = cmd.ExecuteScalar(); 

} 
+0

Me quito el sombrero. +1! –

+0

Todavía tengo que escribir el código para ejecutar transacciones en múltiples bases de datos, ¡pero me estoy acercando a verificar esto! :) – Dave

Cuestiones relacionadas