我是vb和mysql的初学者......我正在开发一个项目(vb 2010 express和mysql5.1),其中lan网络中有两台机器。应用程序安装在两台计算机上,数据库位于其中一台计算机上。两者都使用相同的用户(dr_admin)连接到DB。我的问题是,从一台机器进行的更改不会反映在另一台机器上。
DBCon = New ADODB.Connection
DBCon.ConnectionString = ("Driver={MySQL ODBC 3.51 Driver};Server=Admin-PC; Database=dr_db; User=dr_admin;Password=dradmin;pooling=false;Option=3;")
DBCon.Open()
MsgBox(DBCon.State)
Try
Cmd = New ADODB.Command
Cmd.ActiveConnection = DBCon
Cmd.CommandText = "SEt autocommit=0;"
Cmd.Execute()
这就是我连接的方式,我可以在需要的地方手动提交和回滚。
我从数据库中填充一个列表。该列表出现在面板上。每次面板变得可见时都会加载数据。 但新数据并未显示出来。 然后我添加了一些代码来关闭当前的数据库连接并重新打开。
Public Sub reconnect_pr()
DBCon.Close()
MsgBox(DBCon.State)
DBCon = Nothing
DBCon = New ADODB.Connection
DBCon.ConnectionString = ("Driver={MySQL ODBC 3.51 Driver};Server=Admin-PC;Database=dr_db; User=dr_admin;Password=dradmin;pooling=false;Option=3;")
DBCon.Open()
MsgBox(DBCon.State)
Try
Cmd = New ADODB.Command
Cmd.ActiveConnection = DBCon
Cmd.CommandText = "SEt autocommit=0;"
Cmd.Execute()
Catch ex As Exception
MsgBox("autocommit error - Contact admin", MsgBoxStyle.OkOnly, "Patient Care")
End Try
End Sub
这是我用来从db中检索数据的代码。
Cmd = New ADODB.Command
Cmd.ActiveConnection = login_frm.DBCon
Cmd.CommandText = "select pat_no,pat_id,pat_name from pat_token_details order by pat_no;"
Rs = Cmd.Execute
exp_tod_pat_list.Items.Clear()
exp_tod_pat_list.Items.Add("None")
Do While Not Rs.EOF
v_token = Rs("pat_no").Value
v_pat_name = Rs("pat_name").Value
v_id = Rs("pat_id").Value
exp_tod_pat_list.Items.Add("Token id: " + v_token + " - " + v_pat_name + " ( " + v_id + " )")
Rs.MoveNext()
Loop
Catch ex As Exception
MsgBox("unable to fetch current token details", MsgBoxStyle.OkOnly, "Token")
End Try
仍然无效..但是当我关闭应用程序并再次打开它时会反映出来。
请帮助我理解这个问题。
感谢。
答案 0 :(得分:0)
对此行为原因的简短解释:
在MySql中,默认隔离级别是REPEATABLE READ
在此模式下(有关详细信息,请参阅此链接:click me):
同一事务中的所有一致读取读取第一次读取建立的快照。此约定意味着如果在同一事务中发出多个普通(非锁定)SELECT语句,则这些SELECT语句也相互一致。
简单来说:如果您在同一个事务中发出,多次使用相同的SELECT语句,无论数据库的更改如何,您都始终获得相同的结果由其他会议制作。
会话记住,事务中的第一个SELECT在时间X运行,并且在X时刻“生成数据快照”,然后所有后续选择将在时间X读取此snaphshot,但不读取当前数据。
请参阅下一个链接:(click me):
如果事务隔离级别为REPEATABLE READ(默认级别),则同一事务中的所有一致性读取将读取该事务中第一次此类读取所建立的快照。通过提交当前交易,然后在发出新查询之后,您可以为您的查询获取更快的 。
通过提交交易(或发出交易回滚),您结束此交易,下一个SELECT(在新交易中)将看到新数据。
如果启用了auto_commit,则所有选择总是自动提交 - 因此您始终可以看到新数据。
但是如果禁用自动提交,则在可重复读取(默认)isolaton级别中,您必须手动提交以查看更改数据库。
注意:上述行为仅适用于InnoDb表。其他引擎不支持ACID。