coldfusion文档(我使用CF8)声明:
对请求的数据进行更改 由查询未提交到数据源,直到其中的所有操作 事务块已成功执行。
但它也说:
在事务块中,您可以向多个数据库写入查询,但在将查询写入另一个数据库之前,必须将事务提交或回滚到一个数据库
我的代码库中有多个事务,它们访问2个数据库以进行选择和更新/插入。该代码假定所有查询都将成功或将全部回滚。但是我根据文档中的行说明并不知道这是否正确:"但是在将查询写入另一个数据库之前,您必须将事务提交或回滚到一个数据库。
如果对第一个数据库的写入成功,那么对另一个数据库的后续写入失败会有什么行为?首先会回滚吗?
答案 0 :(得分:4)
文档的含义是您必须在查询之后将<cftransaction action="commit">
放到一个数据库中,然后才能继续使用其他数据源。如果它在没有使用提交的情况下检测到您在事务内部具有包含不同数据源的<cfquery>
标记,则会抛出错误。有关确切的事务支持,请参阅数据库文档,因为CFML通过数据库驱动程序仅代表您发送事务命令,它不对其执行或行为负责。在数据库中启用JDBC日志记录以查看此操作。
无效:
<cftransaction action="begin">
<cfquery datasource="foo">
select * from foo_test
</cfquery>
<cfquery datasource="bar">
select * from bar_test
</cfquery>
</cftransaction>
会工作
<cftransaction action="begin">
<cfquery datasource="foo">
select * from foo_test
</cfquery>
<cftransaction action="commit"><!-- Commit before switching DSNs --->
<cfquery datasource="bar">
select * from bar_test
</cfquery>
</cftransaction>
如果通过单个数据源使用三个部件名称进行多个数据库访问,则事务控制将起作用。
<cftransaction action="begin">
<cfquery datasource="foo">
INSERT INTO foo_test ( id )
VALUES ( 70 )
</cfquery>
<!-- insert into the bar database via the foo datasource --->
<cfquery datasource="foo">
INSERT INTO bar.dbo.bar_test (id )
VALUES ( 'frank' ) <!-- Fails because not an int and the prior insert into foo is rolled back -->
</cfquery>
</cftransaction>
答案 1 :(得分:-2)
CFTransaction的默认行为是,如果事务块中的任何位置存在异常,则将回滚所有写入。因此,如果一个查询失败,则回滚所有查询。
仅当数据库支持基于事务控制语言(SQL的一个子集)的提交和回滚时。
但是,您可以精确控制CF事务的工作方式,超出默认行为,包括保存点和嵌套事务等功能。