因此,这可能只是我理解cftransaction
标签时的根本失败。
我有一堆Create Table SQL语句,一个接一个,并且其中一个有错误,这些都包含在一个巨大的cftransaction
中,但是当错误发生时,它没有&#39 ; t回滚create语句。
<cfset variables.x = 0>
<cftry>
<cftransaction action="begin">
<cfquery name="variables.qTables" datasource="dev_db">
CREATE TABLE `dev_db`.`tbl_entries_import` (
`p_id` int( 11 ) default NULL ,
`p_Title` varchar( 255 ) default NULL ,
`p_FirstName` varchar( 255 ) default NULL ,
`p_unique_email` varchar( 255 ) default NULL ,
PRIMARY KEY ( `p_ID` ),
UNIQUE KEY `p_unique_email_UNIQUE` (`p_unique_email`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
</cfquery>
<cfset variables.x++>
<cftransaction action="setsavepoint" savepoint="#variables.x#"/>
<cfquery name="variables.qTables" datasource="dev_db">
CREATE TABLE `dev_db`.`tbl_entry2office_import` (
`entryID` int( 11 ) NOT NULL default '0',
`officeID` int( 11 ) NOT NULL default '0'
PRIMARY KEY ( `entryID` )
) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;
</cfquery>
<cfset variables.x++>
<cftransaction action="setsavepoint" savepoint="#variables.x#"/>
</cftransaction>
<cfcatch>
<cfloop from="#variables.x#" to="1" index="variables.y" step="-1">
<cftransaction action="rollback" savepoint="#variables.y#">
</cfloop>
<cfdump var="#cfcatch#">
</cfcatch>
</cftry>
所以在第二个cfquery
之后(这应该会导致错误),我希望第一个cfquery
中的表不存在于我的架构中,但目前它会这样做。
答案 0 :(得分:6)
CREATE TABLE
语句会导致隐式提交:&#34; 13.3.3 Statements That Cause an Implicit Commit&#34;:
本节中列出的语句(以及它们的任何同义词)隐式结束当前会话中活动的任何事务,就好像您在执行语句之前已完成COMMIT一样。
定义或修改数据库对象的数据定义语言(DDL)语句。 ALTER DATABASE ...升级数据目录名称,更改事件,更改程序,更改服务器,更改表,创建数据库,创建事件,创建索引,创建过程,创建服务器,创建表,DROP DATABASE, DROP EVENT,DROP INDEX,DROP PROCEDURE,DROP SERVER,DROP TABLE,RENAME TABLE,TRUNCATE TABLE。
(我的强调)