现在的位置: 首页 > 综合 > 正文

原来在事务中是可以使用 Create Table 语句的!

2012年10月10日 ⁄ 综合 ⁄ 共 933字 ⁄ 字号 评论关闭

最近做一个项目,需要在数据库中动态创建表格(Create Table)来保存数据。为了保证表格名称的唯一,我将新创建表格的名称定义为“[prefix]_[guid]”。但是在创建表格的同时需要做一些其他相关的事情,而且需要保证这两个动作的事务性。

原来在看 Sql Server 的联机帮助的时候,看到有一些在事务不能使用的语句,误将Create TABLE也包含在内了!在开始写程序的时候,我想既然不能在事务(包括 System.EnterpriseServices 的事务支持和 sql server 中存储过程的事务支持)中使用,那就将支持事务操作的和不能支持事务操作的分开执行:使用 SqlTransaction 执行其他支持事务操作的语句,但是并不 Commit;然后再执行创建表格的操作(使用另外一个 SqlConnection,否则会报错的),如果成功,则提交前面的 SqlTransaction,否则回滚。

后来在写单元测试程序的时候,由于马虎将两个操作使用了相同的 SqlConnection,并都将 Transaction 属性设置成了一样,结果竟然没有报错,而且完全 OK。当时还以为哪儿写错了!后来再翻 Sql Server 的联机帮助,原来真的没有限制 Create Table 语句!真是走了不少弯路啊!不过,真的是“塞翁失马”哦,以后再碰到相同的问题就能迎刃而解了 :)

You can use all Transact-SQL statements in a transaction, except for the following statements:

  • ALTER DATABASE
  • BACKUP LOG
  • CREATE DATABASE
  • DISK INIT
  • DROP DATABASE
  • DUMP TRANSACTION
  • LOAD DATABASE
  • LOAD TRANSACTION
  • RECONFIGURE
  • RESTORE DATABASE
  • RESTORE LOG
  • UPDATE STATISTICS

Also, you cannot use sp_dboption to set database options or use any system procedures that modify the master database inside user-defined transactions.

抱歉!评论已关闭.