背景: SQL Server Version 2014,设计的是发票订单系统。
我有几个问题来确认我对 SQL Server 并发性的看法。作为简要背景,创建此模型的开发人员构建了每个订单库存表(属于订单的一部分的项目)和带有InUse字段的订单表(订单)。会发生的情况是,当销售人员尝试更新订单时,通过更改订购商品的名称(例如需要将一本名为《哈利波特》的书重命名为《哈利波特》),如果其他人正在阅读该数据,他们就不能访问对象。
实际的数据库设计是这样的:该SalesOrder表将具有SalesPersonId与InUse列设置为1,没有人可以访问OrderId。这意味着对于每次读取、更新、插入或删除,都会发生三个事务:首先将更新设置InUse为 1,以便没有人可以访问特定的OrderId,然后是实际事务,然后是将最终更新设置InUse为 0 以允许人们访问那个OrderId。这意味着多次读取和写入而不是更少 - 随着规模的扩大,性能噩梦!
开发人员解释说,如果两个用户尝试写入或更新订单中的项目,这可以解决并发问题。嗯?
根据我对 SQL Server 的了解,如果两个用户尝试写入相同的顺序——比如添加两个新项目,它们都会被添加,因为这些将作为元数据插入日志中,然后添加到磁盘上。另外,如果插入物完全相同,我们应该设计具有唯一约束的表来防止这种情况(公平地说,该开发人员根本不使用约束和外键),因此不会发生第二次插入。这意味着两个用户可以将插入写入同一个表,并且插入通常会很快发生。
此外,如果两个用户正在更新同一个记录——比如说一个OrderItemId名字为“Harry Potter”的 1 来更新为“Harry Potter”(这是一个特定的项目OrderId),即使是两个不同的更新也会发生,但是第二个无关紧要,因为它是相同的更新。 只有当对同一对象发生两次不同的更新时,例如更新一是“哈利波特”,更新二是“哈利波特”,才会出现问题,因为它们不同。但是,不允许用户访问对象并不能解决这个问题(他的设计),因为用户一个的更新可能是错误的更新,从而锁定了用户 2(反之亦然)。
我不明白这个设计;对我来说,它反映了对SQL Server并发的完全误解,以及SQL数据库如何处理事务,而且他创建的大部分内容已经由SQL Server在后端处理(除了没有解决错误更新的问题) . 但是,也许我遗漏了一些东西,其他人可以启发我这是 SQL Server 的标准做法(我以前从未见过这种设计)。
所以这就是我到目前为止所拥有的:
--Read xml content into a XML data type variable
DECLARE @FileData XML
SELECT @FileData = CONVERT(XML, BulkColumn)
FROM OPENROWSET(BULK '\\file_path\test.xml', SINGLE_BLOB) AS x
--Read from the XML variable to create Entity-Attribute-Value table
SELECT N1.Id.value('@Id', 'varchar(50)') as Id
, N1.Id.value('@Name', 'varchar(100)') as Name
, N2.AttributeLongName.value('@AttributeName', 'varchar(100)') as AttributeName
, N3.AttributeValue.value('.', 'varchar(MAX)') as AttributeValue
FROM @FileData.nodes('/Data/Entities/Entity') as N1(Id) ---1st lvl Node contains the Entity
cross apply Id.nodes('Attributes/Attribute') as N2(AttributeName) --2nd lvl Node contains AttributeName
cross apply AttributeName.nodes('Values/Value') as N3(AttributeValue) --3rd lvl …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种在创建时限制 DB2 数据库大小(在磁盘中)的方法。但我找不到。
在 SQL Server 上,我们可以这样做:
Create Database MyDatabase
on (Name='MyDatabase_Data',
Filename='c:\db\BdUnisanta_Data.mdf',
Size= 20MB,
FileGrowth = 10%,
Maxsize=100MB)
log on
(Name = 'MyDatabase_log',
Filename = 'c:\db\MyDatabase_Log.ldf',
Size = 5MB,
FileGrowth = 5%,
MAXSIZE = UNLIMITED
)
Run Code Online (Sandbox Code Playgroud)
DB2 中的等效形式是什么?是否可以?
我收到此错误:
[Error] PLS-00103 (23: 9): PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:
begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
尝试运行此代码时。我在这里做错了什么?
我应该使用批量收集吗?如果是这样,如何?
CREATE OR REPLACE PROCEDURE P_CLEAN_LICENSEE_ARCHIVE AS
BEGIN
/*******************************************************************/
/* This is an array of IDs for licensees */
/*******************************************************************/
array_l := l_arr(1026679, 1026714, 1036991, 1026735, 1026715, 1159363, 1026703, 1169002, 1052762, 1070152, 1026684,
1026685, 1164376, 1026693, 1026733, 1026698, 1026701, 1026680, 1026708, 1026710, 1026688, 1026697, …Run Code Online (Sandbox Code Playgroud) 我收到此错误:
消息 8115,级别 16,状态 2,过程 sp_Blitz,第 469 行算术溢出错误将表达式转换为数据类型 int。
在sp_Blitz具有 52 个用户数据库的服务器中运行时。当我使用@CheckUserDatabaseObjects = 0.
我有 10/14/2016 的最新版本。
任何想法我做错了什么或者我应该用什么参数来运行它,因为有这么多的用户数据库?
我的集群的两个节点中都运行着 Windows Server 2019 和 SQL Server 2019。在我的情况下,没有证人一切正常。我需要 Windows Server 故障转移群集 (WSFC) 用于我用作 DR 解决方案的可用性组。
当两个节点都运行时,我将关闭一个节点(它具有我的 AG 的主数据库)并从另一个节点执行可用性组的故障转移,反之亦然。有人可以解释为什么我们需要在两个节点故障转移集群中的见证,或者我如何重新创建我们需要见证的场景。
sql-server ×4
clustering ×1
concurrency ×1
datafile ×1
db2 ×1
db2-luw ×1
ddl ×1
oracle ×1
performance ×1
plsql ×1
sp-blitz ×1
xml ×1
xquery ×1