我想实现如下的原子事务:
BEGIN TRAN A
SELECT id
FROM Inventory
WITH (???)
WHERE material_id = 25 AND quantity > 10
/*
Process some things using the inventory record and
eventually write some updates that are dependent on the fact that
that specific inventory record had sufficient quantity (greater than 10).
*/
COMMIT TRAN A
Run Code Online (Sandbox Code Playgroud)
问题是发生的其他交易消耗了我们库存中的数量,因此在选择记录和更新写入事务A之间,该记录可能会成为无效选择,因为它的数量可能已降低到阈值以下在WHERE子句中.
所以问题是我应该在WITH子句中使用什么锁定提示来防止在完成更新并提交事务之前更改选定的库存记录?
编辑:非常感谢John,一个好的解决方案似乎是将事务隔离级别设置为REPEATABLE READ.这将确保"在当前事务完成之前,没有其他事务可以修改当前事务已读取的数据".
我们可以在事务中包装对存储过程的调用,并指定隔离级别.
或者我们可以将事务放在存储过程中指定一个隔离级别.
哪个更好?
你知道我在谈论的那个.
我们已经在某个时候到过那里了.你得到了那种可怕的恐惧感,而我的上帝的实现确实发生了.
当然,你现在可以笑一笑,对,所以继续和我们分享你的SQL Server意外.
如果您可以详细说明如何解决问题,以便我们可以一起从错误中吸取教训,那就更好了.
所以为了让球滚动,我会先走......
这是我早年作为初级SQL Server大师的回归.我正在围绕企业管理器竞争,履行一些管理职责.你知道它是怎么回事,查看几个日志,确保备份运行正常,一点点数据库管理,几乎关于自动驾驶的业务,并按弹出的常规提示点击回车键.
哦,等等,是"你确定要删除此表"提示.太晚了!
只是为了确认任何有抱负的DBA,删除生产表是一件非常非常糟糕的事情!
毋庸置疑,世界纪录被迅速设置为最快的数据库恢复到新的数据库,很快就会进行表迁移,哦是的.当然,其他人都不是明智的,但仍然是一个宝贵的经验教训.浓缩!
我检查了SCOPE_IDENTITY()的文档,并说"范围是一个模块:存储过程,触发器,函数或批处理." 当我在SSMSE中运行查询时,这很简单,但在C#中我使用SqlCommand来执行我的语句.
问题是:那里的范围是什么?在一个连接下执行后续命令是否等同于批处理?或者也许每个命令都在不同的范围内,我需要一个事务才能使用它?
我知道有一个变量,函数或存储过程可用于查找SQL Server安装到的路径:
例如:
c:\Program Files\Microsoft SQL Server\MSSQL.7\MSSQL
Run Code Online (Sandbox Code Playgroud)
要么
m:\CustomInstance\MSSQL
Run Code Online (Sandbox Code Playgroud)
实际上,我希望SELECT为默认备份路径.但由于我怀疑存在,我只是将\ BACKUP添加到安装路径并将其调得足够接近.
select filename from sysaltfiles
where name = db_name()
Server: Msg 208, Level 16, State 1, Line 1
Invalid object name 'sysaltfiles'.
Run Code Online (Sandbox Code Playgroud)
select filename from master.dbo.sysaltfiles
where name = db_name()
filename
----------------
(0 row(s) affected)
Run Code Online (Sandbox Code Playgroud) 在针对SQL Server 2005运行的SQL Server Management Studio(SSMS)中,我有一个包含许多视图的解决方案.
这些视图不按字母顺序排序.
任何人都可以提供解释原因,或者按字母顺序排序吗?
我最近发现了以下文章:
http://www.tsqltutorials.com/with-common-table-expressions.php
本文没有列出可用的SQL服务器版本.这是否适用于SQL Server 2000,如果不是,它可以使用的最早版本是什么?
更新:我确实尝试了快速测试,测试不起作用.我要求它在SS2000中不起作用,以确保它不是我或我的设置.
我刚开始为一家规模合理的公司开展我的第一份开发工作,该公司必须管理大量数据.平均数据库是6GB(从我到目前为止看到的).其中一项工作是报道.目前的工作方式是 -
数据被复制并传输到数据仓库.从那里,收集特定报告所需的所有数据(数千行和大量表)并汇总到仓库中的报告数据库.这一切都是通过存储过程完成的.
请求报告时,将调用存储过程,该过程将数据复制到PHP读取的报告数据库以显示数据.
我根本不是存储过程的忠实粉丝.但是我所说过的人坚持认为存储过程是唯一的选择,因为通过编程语言直接查询数据的速度非常慢(想想30分钟?).安全也是一个问题.
所以我的问题是 - 当你有一个非常大的数据集时,是否需要存储过程?对于如此大量的数据,查询是否确实需要很长时间,或者DB服务器是否存在问题或数据的排列方式(以及索引?).我感觉有些不对劲.
database sql-server performance database-design stored-procedures
在更改数据库模式之前我发出:
ALTER DATABASE SET RESTRICTED_USER
Run Code Online (Sandbox Code Playgroud)
在结束的时候:
ALTER DATABASE SET MULTI_USER
Run Code Online (Sandbox Code Playgroud)
我知道正在运行的交易将被允许继续直到完成.
问:有没有办法等到所有普通用户都不在数据库中?
问:普通用户可以发出更多交易吗?他们可以继续工作,直到与服务器断开连接?
我在网络共享上有一个DBF文件,我正在尝试选择一个SQL Server表.
这个查询:
SELECT * FROM OPENQUERY(MyLinkedServer, 'SELECT * FROM DP')
Run Code Online (Sandbox Code Playgroud)
...抛出此错误:
用于链接服务器"MyLinkedServer"的OLE DB提供程序"MSDASQL"返回消息"[Microsoft] [ODBC Visual FoxPro驱动程序]没有足够的内存用于文件映射."
消息7399,级别16,状态1,行11链接服务器"MyLinkedServer"的OLE DB提供程序"MSDASQL"报告错误.提供程序内存不足.
消息7320,级别16,状态2,行11无法针对链接服务器"MyLinkedServer"对OLE DB提供程序"MSDASQL"执行查询"SELECT*FROM DP".
我已经读过使用SYS(3050)来释放FoxPro的内存.我无法弄清楚如何针对链接服务器执行该操作.
sql-server ×10
sql ×4
t-sql ×4
.net ×1
c# ×1
concurrency ×1
database ×1
foxpro ×1
isolation ×1
locking ×1
performance ×1
ssms ×1