我使用了事务和更新锁,但是还是不行! objConn.BeginTrans strB = Format(Now, "yyyymmdd") objRs.Open "select * from MaxV where Mname ='维修单' and DanJBH like '%" & strB & "%'", objConn, 1, 3 If Not objRs.EOF Then '表示有 strB = strB & CStr(Format(CDbl(Right(Trim(objRs("DanJBH").value), 4)) + 1, "0000")) Else strB = strB & "0001" End If objRs.Close strDanJBH = strB
objRsO.Open "select * from MaxV where Mname ='维修单'", objConn, 1, 3 If Not objRsO.EOF Then objConn.Execute "update MaxV set DanJBH='" & strDanJBH & "' where Mname ='维修单'" Else objConn.Execute "insert into MaxV(Mname,DanJBH) values('维修单','" & strDanJBH & "')" End If
'------------------------- objRs.Open "select * from fwd where danjFL='维修单' and DanJBH='" & strB & "'", objConn, 1, 1 If objRs.EOF Then objConn.Execute "insert into Fwd(DanJBH,danjFL,RQ) values('" & strB & "','维修单','" & Now & "')" Else objRs.Close objRsO.Close GoTo aaaa End If objConn.CommitTrans
我用了如下的二个timer进行测试 Private Sub Timer1_Timer() Dim objRs As New ADODB.Recordset Dim aobjRs.Open "select * from test", objConn, 1, 3 a = CInt(Trim(objRs("test").Value)) + 1 objRs.CloseobjRs.Open "update test set test='" & a & "'", objConn, 1, 3 Label1.Caption = a & " 成功" End SubPrivate Sub Timer2_Timer() Dim objRs As New ADODB.Recordset Dim aobjConn.BeginTrans objRs.LockType = adLockPessimistic objRs.Open "select * from test with (tablockx)", objConn, 1, 3 a = CInt(Trim(objRs("test").Value)) + 1 Delay 5 '延迟5秒 objConn.Execute "update test set test='" & a & "'" Label2.Caption = a & " 成功" objRs.Close objConn.CommitTrans 'Timer2.Enabled = False 'Timer1.Enabled = False End Sub这二个合起来进行测试,我让timer2用了事务,并延迟5秒更新,另一个timer1在不停的更新,要想办法,让二个timer能使数据同步目前不能同步的!
这个应该是数据库dbms做的事!
不过ADO的Recordset对象在打开时可以使用这样的参数=================================================================
adLockReadOnly (默认值)只读 — 不能改变数据。
adLockPessimistic 保守式锁定(逐个) — 提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录来完成。
adLockOptimistic 开放式锁定(逐个) — 提供者使用开放式锁定,只在调用 Update 方法时才锁定记录。
adLockBatchOptimistic 开放式批更新 — 用于批更新模式(与立即更新模式相对)。
rs.open sql,conn,1,3
这样子就可以在查询时锁定,别人不能查询到当前的数据吗?>??
用户,选中用户,权限里面去掉update
adLockPessimistic。指定在编辑一个记录时,立即锁定它。
adLockOptimstic。指定只有调用记录集的Update方法时,才锁定记录。
adLockBatchOptimstic。指定记录只能成批地更新。
现在的这样设计,在多个人同时加入数据时,就会有一些加入的记录复盖原先已加入或是别人刚加入的记录!
objConn.BeginTrans
strB = Format(Now, "yyyymmdd")
objRs.Open "select * from MaxV where Mname ='维修单' and DanJBH like '%" & strB & "%'", objConn, 1, 3
If Not objRs.EOF Then '表示有
strB = strB & CStr(Format(CDbl(Right(Trim(objRs("DanJBH").value), 4)) + 1, "0000"))
Else
strB = strB & "0001"
End If
objRs.Close
strDanJBH = strB
objRsO.Open "select * from MaxV where Mname ='维修单'", objConn, 1, 3
If Not objRsO.EOF Then
objConn.Execute "update MaxV set DanJBH='" & strDanJBH & "' where Mname ='维修单'"
Else
objConn.Execute "insert into MaxV(Mname,DanJBH) values('维修单','" & strDanJBH & "')"
End If
'-------------------------
objRs.Open "select * from fwd where danjFL='维修单' and DanJBH='" & strB & "'", objConn, 1, 1
If objRs.EOF Then
objConn.Execute "insert into Fwd(DanJBH,danjFL,RQ) values('" & strB & "','维修单','" & Now & "')"
Else
objRs.Close
objRsO.Close
GoTo aaaa
End If
objConn.CommitTrans
Private Sub Timer1_Timer()
Dim objRs As New ADODB.Recordset
Dim aobjRs.Open "select * from test", objConn, 1, 3
a = CInt(Trim(objRs("test").Value)) + 1
objRs.CloseobjRs.Open "update test set test='" & a & "'", objConn, 1, 3
Label1.Caption = a & " 成功"
End SubPrivate Sub Timer2_Timer()
Dim objRs As New ADODB.Recordset
Dim aobjConn.BeginTrans
objRs.LockType = adLockPessimistic
objRs.Open "select * from test with (tablockx)", objConn, 1, 3
a = CInt(Trim(objRs("test").Value)) + 1
Delay 5 '延迟5秒
objConn.Execute "update test set test='" & a & "'"
Label2.Caption = a & " 成功"
objRs.Close
objConn.CommitTrans
'Timer2.Enabled = False
'Timer1.Enabled = False
End Sub这二个合起来进行测试,我让timer2用了事务,并延迟5秒更新,另一个timer1在不停的更新,要想办法,让二个timer能使数据同步目前不能同步的!