我是 DBMS 的初学者,对不起,如果我的问题听起来很愚蠢。我经常看到一些教科书上说:create a schema。这是否意味着“创建数据库”?
但是,模式不也是表的骨架吗?我们不是经常用schema来描述一个表的结构,比如列名/列类型吗?那么架构是表概念还是数据库概念?
假设我们有一笔交易 A:
BEGIN TRAN A;
//--------------------< time a
SELECT productid, unitprice
FROM Production.Products
WHERE productid = 2;
//--------------------< time b
UPDATE Production.Products
SET unitprice += 1.00
WHERE productid = 3;
COMMIT TRAN A;
我们知道,对于事务 A(在默认的 Read Committed 隔离级别下),需要一个共享锁(针对 productid 2)和一个排他锁(针对 productid 3)。
我的问题是,对于 productid 3 的独占锁,锁是什么时候发生的?在事务开始时,事务真正开始更新的时间是在时间 a 还是时间 b?
假设连接 1 中的事务尝试修改记录 A 然后提交。因为提交仅将缓冲区中的日志记录刷新到磁盘,所以检查点的工作是将所有脏页刷新到磁盘 (mdf)。并且有一个连接B在连接1提交后试图读取记录A。(由于A已经提交,这里没有锁的东西)
所以我的问题是:
Q1-如果连接B在检查点之前读取记录A,是否意味着它将读取旧值?
Q2-如果连接B在检查点之后读取记录A,是否意味着它将读取新值?
Q3-有时连接B得到新值,有时它得到旧值,这不是很奇怪吗,解决这个问题的方法是A需要手动触发检查点吗?
DECLARE @Error int;
INSERT INTO Person.BusinessEntityContact
(BusinessEntityID
,PersonID
,ContactTypeID)
VALUES
(0,0,1);
SELECT @Error = @@ERROR;
PRINT ‘The Value of @Error is ‘ + CONVERT(varchar, @Error);
我有 :
消息 547,级别 16,状态 0,第 4 行 INSERT 语句与 FOREIGN KEY 约束“FK_BusinessEntityContact_Person_PersonID”冲突......该语句已终止。@Error 的值为 547
这意味着在抛出错误后该过程仍在继续。
但是,如果我尝试创建一个表(运行下面的脚本两次以触发错误)为:
CREATE TABLE OurIFTest(
Col1 int PRIMARY KEY
);
IF @@ERROR != 0
PRINT 'Problems!';
ELSE
PRINT 'Everything went OK!';
然后我得到了
消息 2714,级别 16,状态 6,第 2 行数据库中已经有一个名为“OurIFTest”的对象。
这意味着在抛出错误时进程终止。
那么为什么进程因“创建”而不是“插入”而终止?