在我们的项目中,我们使用TransactionScope来确保我们的数据访问层在事务中执行它的操作.我们的目标是不要求在最终用户的计算机上启用MSDTC服务.
麻烦的是,在我们开发人员的一半机器上,我们可以在禁用MSDTC的情况下运行.另一半必须启用它或他们得到"MSDTC on [SERVER] is unavailable"错误消息.
它真的让我摸不着头脑,让我认真地考虑回归到基于ADO.NET事务对象的家庭式的类似TransactionScope的解决方案.这看起来很疯狂 - 在我们开发人员的一半上工作(并且没有升级)的代码确实在其他开发人员上升级.
我希望得到一个更好的答案,跟踪为什么交易升级到DTC但不幸的是它没有.
这是一个会导致问题的示例代码,在尝试升级的机器上,它会尝试在第二个连接上升级.Open()(是的,当时没有其他连接打开.)
using (TransactionScope transactionScope = new TransactionScope() {
using (SqlConnection connection = new SqlConnection(_ConStr)) {
using (SqlCommand command = connection.CreateCommand()) {
// prep the command
connection.Open();
using (SqlDataReader reader = command.ExecuteReader()) {
// use the reader
connection.Close();
}
}
}
// Do other stuff here that may or may not involve enlisting
// in the ambient transaction
using (SqlConnection connection = new …
Run Code Online (Sandbox Code Playgroud) 在办公室,当我离开的时候,我很少注销或重启.我只是锁定我的工作站并回家,将我的所有开发工具完全留给我.
如果Windows-Update在半夜滚动并重新启动我的机器,我只是有点恼怒,因为当我第二天早上回来时,我运行的任何MS Office应用程序或Visual Studio实例都已经自动重启,打开我可能正在处理的任何文件/项目/解决方案.
我的问题是:如何让我的Windows窗体应用程序(C#)执行此操作?如果系统自动重新启动,我的应用程序是否有某种方式"注册"它想要重新启动?
有没有办法使用SQL SMO修复SQL 2005/2008数据库中的孤立用户?
您可以通过枚举用户并查找空User.Login
属性来相对轻松地找到孤立用户:
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
public static IList<string> GetOrphanedUsers(Server smoServer, string database) {
Database db = smoServer.Databases[database];
List<string> orphanedUsers = new List<string>();
foreach (User user in db.Users) {
if (!user.IsSystemObject && user.Login == string.Empty) {
orphanedUsers.Add(user.Name);
}
}
return orphanedUsers;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,修复并不像将User.Login
属性设置为匹配的服务器登录名那么简单.User.Login
确实有一个setter,但我不知道如何将它传播回服务器.它似乎只有在您创建新的时才可用User
.
我考虑从数据库中删除用户并将服务器登录重新绑定到数据库,但这会带来额外的复杂性.重复分配默认模式,角色等复杂问题,如果他们在数据库中拥有模式,那么当您通过这些更改进行级联时会遇到更多麻烦.这足以让你想要内联SQL并完成它:
ServerConnection server = new ServerConnection("MyBox\SQLInstance");
Database db = server.Databases["MyDatabase"];
db.ExecuteNonQuery("sp_change_users_login 'auto_fix', 'ORPHANED_USERNAME'")
Run Code Online (Sandbox Code Playgroud)
但是,我宁愿不内联对系统存储过程的调用.
有什么建议?
前段时间我问了一个关于TransactionScope升级到MSDTC的问题,当时我没想到它.(上一个问题)
简而言之,在SQL2005中,为了使用TransactionScope,您只能在TransactionScope的生命周期内实例化并打开一个SqlConnection.使用SQL2008,您可以实例化多个SqlConnections,但在任何给定时间只能打开一个SqlConnections.SQL2000将始终升级到DTC ...我们的应用程序中不支持SQL2000,即WinForms应用程序BTW.
我们对单连接问题的解决方案是创建一个名为LocalTransactionScope(又名'LTS')的TransactionScope助手类.它包装了一个TransactionScope,最重要的是,它为我们的应用程序创建并维护了一个SqlConnection实例.好消息是,它可以工作 - 我们可以在不同的代码片段中使用LTS,它们都加入了环境事务.非常好.问题是,创建的每个根 LTS实例都将创建并有效地终止连接池中的连接.通过'Effectively Kill',我的意思是它将实例化一个SqlConnetion,它将打开一个新连接(无论出于何种原因,它永远不会重用来自池的连接),并且当该根LTS被释放时,它会关闭并处理SqlConnection,这是应该将连接释放回池中以便可以重用它,但是,它显然永远不会被重用.池膨胀直到最大化,然后在建立max-pool-size + 1连接时应用程序失败.
下面我附上了一个精简的LTS代码版本和一个示例控制台应用程序类,它将演示连接池耗尽.要观察连接池膨胀,请使用SQL Server Managment Studio的"活动监视器"或此查询:
SELECT DB_NAME(dbid) as 'DB Name',
COUNT(dbid) as 'Connections'
FROM sys.sysprocesses WITH (nolock)
WHERE dbid > 0
GROUP BY dbid
Run Code Online (Sandbox Code Playgroud)
我在这里附加LTS,以及一个示例控制台应用程序,您可以使用它来演示它将使用池中的连接并且永远不会重复使用也不会释放它们.您需要为LTS添加对System.Transactions.dll的引用以进行编译.
注意事项:它是打开和关闭SqlConnection的根级LTS,它始终在池中打开一个新连接.嵌套LTS实例没有区别,因为只有根LTS实例建立了SqlConnection.如您所见,连接字符串始终相同,因此应该重用连接.
是否有一些我们没有遇到的神秘条件会导致连接无法重复使用?除了完全关闭池外,还有其他解决办法吗?
public sealed class LocalTransactionScope : IDisposable
{
private static SqlConnection _Connection;
private TransactionScope _TransactionScope;
private bool _IsNested;
public LocalTransactionScope(string connectionString)
{
// stripped out a few cases that need to throw an exception
_TransactionScope = new TransactionScope(); …
Run Code Online (Sandbox Code Playgroud) 我正在审查一些代码,我遇到了以下代码:
List authorIntList = authorIds?.ToList();
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,authorIds是一个IEnumerable.?
上面的代码行的目的是什么?我不确定我以前见过这种模式.它做了什么以及在哪个版本的.NET中实现了它?
我有一张桌子bsort
:
CREATE TABLE bsort(a int, data text);
Run Code Online (Sandbox Code Playgroud)
这里data
可能不完整.换句话说,一些元组可能没有data
价值.
然后我在表上构建一个b树索引:
CREATE INDEX ON bsort USING BTREE(a);
Run Code Online (Sandbox Code Playgroud)
现在,如果我执行此查询:
SELECT * FROM bsort ORDER BY a;
Run Code Online (Sandbox Code Playgroud)
PostgreSQL是否使用nlogn复杂性对元组进行排序,还是直接从b-tree索引获取顺序?
sorting postgresql indexing sql-order-by postgresql-performance
c# ×4
.net ×2
sql-server ×2
ado.net ×1
c#-6.0 ×1
indexing ×1
msdtc ×1
postgresql ×1
smo ×1
sorting ×1
sql-order-by ×1
transactions ×1
windows ×1
winforms ×1