Si claro mira yo concretamente uso adodb que es un controlador de base de datos el motor es Microsoft.Jet.OLEDB.4.0 y obviamente uso access 2003, aunque no es lo mismo debe funcionar parecido.
al final decidí poner un ejemplo sencillo para no complicarte mucho la explicación, este es uno de mis procedimientos de un sistema que hice hace poco, y este es solo para prevenir la inconsistencia por falla eléctrica o desconección.
Código:
Public CNN As New ADODB.Connection
Public RST As New ADODB.Recordset
Public PRV As String
Public SQL1 As String
Function asg()
PRV = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & frmMain.SourceDB & ";Persist Security Info=False"
End Function
Código:
Sub AgregarNuevoCliente()
call asg
CNN.Open PRV '<{----{ Abriendo conección a la base de datos.
'//Cadena SQL para agregar un nuevo cliente en la base de datos
SQL1 = "INSERT INTO Clientes ( nombres, apellidos, telefono, celular, calle, numero, colonia, municipio, fecha_registro_cliente, Actividad)" _
& "VALUES ('" & Form2.txtNombre & "','" & Form2.txtApellidos & "','" & Form2.txtTelefono & "','" & Form2.txtCelular & "','" & Form2.txtCalle & "','" & Form2.txtNumerodcasa & "','" & Form2.txtColonia & "','" & Form2.txtMunicipio & "', '" & Form2.MonthView1.Value & "', 'Nuevo' )"
CNN.BeginTrans '<{----{ Iniciando una transaccion
RST.Open SQL1, CNN, adOpenStatic '<---[ Se abre el recorset1 (INSERT)
RST.Close '<---[ Se cierra el recorset1
CNN.CommitTrans '<{----{ Cerrando una transaccion exitosa.
CNN.Close '<{----{ Cerrando coneccion a la base de datos.
End Sub
Como ves aqui arriba yo solo utilizo CNN.BeginTrans y CNN.CommitTrans que es un todo o nada sin escalas.
Pero ahora digamos que queremos un boleto y hay posibilidades de cancelar la compra, pero antes debemos de apartar el producto, en este caso, el boleto que representa un determinado numero de asiento.
bueno pues muy facil:
Código:
SQL1 = " ( cadena sql para comprar un boleto en donde el numero de asiento = al que quiere el cliente)"
CNN.BeginTrans '<{----{ Iniciando una transaccion
RST.Open SQL1, CNN, adOpenStatic '<---[ Se abre el recorset1 (INSERT)
if msgbox ("Desea comprar?", vbyesno,"comprar") = vbyes then
RST.Close '<---[ Se cierra el recorset1
CNN.CommitTrans '<{----{ Cerrando una transaccion exitosa.
CNN.Close '<{----{ Cerrando coneccion a la base de datos.
else
RST.Close '<---[ Se cierra el recorset1
cnn.RollbackTrans '<{----{ deshace los cambios
CNN.Close '<{----{ Cerrando coneccion a la base de datos.
end if
en este caso no es necesario que cierres la transaccion en el mismo procedimiento, podrias poner el cierre de la transaccion en otro procedimiento pero antes ya quedo apartado y al momento de cerrar por ejemplo en este caso yo mandaria llamar a un procedimiento digamos:
Código:
Call ConcretarCompra ( "si/no")
....
sub ConcretarCompra ( yesno as string)
if yesno = "si" then
RST.Close '<---[ Se cierra el recorset1
CNN.CommitTrans '<{----{ Cerrando una transaccion exitosa.
CNN.Close '<{----{ Cerrando coneccion a la base de datos.
else
RST.Close '<---[ Se cierra el recorset1
cnn.RollbackTrans '<{----{ deshace los cambios
CNN.Close '<{----{ Cerrando coneccion a la base de datos.
end if
end sub
anque segun MS no es recomendable es posible siempre y cuando seas responsable de terminarla con committrans o con rolbacktrans, que en el idioma humano seria: autorizar el movimiento para committrans y cancelar el movimiento para rolbacktrans.
http://www.forosdelweb.com/f69/workspace-886036/