0

参考此链接http://msdn.microsoft.com/en-us/library/ms947432.aspx

我假设的示例代码可以工作,因为它发布在 Microsoft 的网站上。

&& Start a VFP transaction and a transaction on the server.
Begin Transaction  && FoxPro Start Trans Command

=SQLExec(nConnection, 'BEGIN TRANSACTION')  && SQL Start Trans Commnad

&& Update changes to MyTable.    
lEverythingOK = TableUpdate( 2, .F., 'rv_MyView' )

If lEverythingOK
 && Update changes to MyOtherTable.
 lEverythingOK = tableupdate( 2,.F.,'rv_MyOtherView')
EndIf

&& End the transaction on the server and VFP.

If lEverythingOK
 =SQLExec(nConnection, 'COMMIT')   && SQL COMMIT COMMAND
 End Transaction                   && Foxpro COMMIT COMMAND 
Else
 =SQLExec( nConnection, 'ROLLBACK' )  && SQL ROLLBACK COMMAND
 RollBack                             && FoxPro ROLLBACK COMMAND
EndIf

此示例基于 MS SQL 和 Foxpro 使用 Remote View。我想使用 MYSQL 和 Foxpro 使用 Remote View 重新创建它。问题是如果我发出命令 TableUpdate,即使我还没有发出 =SQLExec(nConnection, 'COMMIT') 命令,记录也会被提交到 MYSQL 服务器。我正在使用 INNODB 引擎。请注意,如果我省略 TableUpdate 命令,我可以从 MYSQL 提交或回滚我的事务。我希望不要删除命令 TableUpdate 以捕获记录中的错误,以便在将其提交到 MYSQL 服务器之前不必检查记录的错误记录。

谢谢。

4

2 回答 2

0

尝试使用自动提交:

设置自动提交=0

从 MySQl 文档:

通过将 autocommit 变量设置为零来禁用自动提交模式后,对事务安全表(例如 InnoDB、BDB 或 NDBCLUSTER 的那些)的更改不会立即永久化。您必须使用 COMMIT 将更改存储到磁盘或 ROLLBACK 以忽略更改。

于 2013-02-06T03:54:32.867 回答
0

您的示例没有对 FoxPro 数据进行任何更改,因此不需要本地事务处理。如果您添加它不是因为您在同一事务中进行本地数据更新,而是因为您认为它“可能有帮助”,请将其删除。那可能会解决问题。

如果您在同一事务中进行本地更改,无论如何您都想重新考虑该设计,因为您应该在远程查询完成后进行本地更改。

如果这不能解决问题,那么您的问题是“记录”被提交,但是您正在更新示例中的两个远程视图 - 代码是否只适用于一个?如果没有,两者都更新了吗?如果你回滚第一个会发生什么?如果您使用的是表格而不是视图怎么办?更改可以根本不回滚吗?

如果你能想出一个最小的可重复样本,那么你得到答案(甚至是解决方案)的机会就会高得多。

于 2012-08-27T22:25:47.457 回答