如何避免SMO生成的查询进入死锁模式?

时间:2016-09-14 15:42:37

标签: c# sql-server smo database-deadlocks

我们有使用SMO进行数据库复制的.Net代码。
我们使用SMO从源数据库中提取模式并在目标数据库中创建它们。
最近我们开始收到一堆僵局问题。
在分析死锁图时,我们发现一些系统基表(例如:sys.sysrowsets)导致了死锁。
在更多的调查中,我们发现...在父DB上运行的一些SQL作业会改变几个表(比如重命名列,创建新列,删除和重新创建索引等),这将在内部更新SQL Server基表。
在使用SMO的同时,我们捕获表的定义,这又取决于内部的系统基表。
这造成了僵局,SMO是僵局的受害者 我的问题是

  1. SMO是否有可以避免死锁的设置?

  2. 如果没有,是否有任何简单的替代方法来提取SQL对象的模式?

  3. 供你参考我在这里粘贴错误和死锁图:

      

    at   Microsoft.SqlServer.Management.Smo.Scripter.ScriptWithList(DependencyCollection   depList,SqlSmoObject [] objects,Boolean discoveryRequired)at   Microsoft.SqlServer.Management.Smo.Scripter.ScriptWithList(Urn [] urns,   SqlSmoObject []对象)at   Microsoft.SqlServer.Management.Smo.Scripter.Script(Urn [] urns,   DataMigration.BulkCopyTable(String。中的SqlSmoObject []对象)   DataMigration.CopyTableWithData()上的schemaName,String tableName)      Microsoft.SqlServer.SmoMicrosoft   SQL   服务器http://go.microsoft.com/fwlink 2047611.0.2100.60   ((SQL11_RTM).120210-1917   )Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionTextScriptServerTransaction   (进程ID 379)与另一个进程在锁资源上死锁   并被选为死锁受害者。重新运行   事务。

    enter image description here

    用于生成脚本的示例代码

    var server = new Microsoft.SqlServer.Management.Smo.Server(srcConnection);
                var database = server.Databases[MasterDatabaseName];
                var table = database.Tables[tableName, schemaName];
                var pk = table.Indexes.Cast<Index>().SingleOrDefault(i => i.IndexKeyType == IndexKeyType.DriPrimaryKey);
                var scripter = new Scripter(server);
                var createTableScript = (null != pk) ? scripter.EnumScript(new SqlSmoObject[] {table, pk}) : scripter.EnumScript(new SqlSmoObject[] {table});
                var createTriggersScript = (table.Triggers.Count > 0) ? scripter.EnumScript(table.Triggers.Cast<SqlSmoObject>().ToArray()) : null;
                scripter.Options = new ScriptingOptions
                {
                    ScriptData = false,
                    ScriptSchema = true,
                    ScriptDrops = true,
                    IncludeIfNotExists = true
                };
                var dropTableScript = scripter.EnumScript(new SqlSmoObject[] {table});
    

0 个答案:

没有答案