我们有使用SMO进行数据库复制的.Net代码。
我们使用SMO从源数据库中提取模式并在目标数据库中创建它们。
最近我们开始收到一堆僵局问题。
在分析死锁图时,我们发现一些系统基表(例如:sys.sysrowsets)导致了死锁。
在更多的调查中,我们发现...在父DB上运行的一些SQL作业会改变几个表(比如重命名列,创建新列,删除和重新创建索引等),这将在内部更新SQL Server基表。
在使用SMO的同时,我们捕获表的定义,这又取决于内部的系统基表。
这造成了僵局,SMO是僵局的受害者
我的问题是
SMO是否有可以避免死锁的设置?
如果没有,是否有任何简单的替代方法来提取SQL对象的模式?
供你参考我在这里粘贴错误和死锁图:
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)与另一个进程在锁资源上死锁 并被选为死锁受害者。重新运行 事务。
用于生成脚本的示例代码
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});