[{"data":1,"prerenderedAt":492},["ShallowReactive",2],{"note:cs\u002Fdb\u002F100+70\u002FDay07-数据库70题-试题12-25":3},{"id":4,"title":5,"body":6,"description":16,"extension":486,"meta":487,"navigation":99,"path":488,"seo":489,"stem":490,"__hash__":491},"notes\u002Fsource\u002Fcs\u002Fdb\u002F100+70\u002FDay07-数据库70题-试题12-25.md","Day 07 - 数据库70题：试题 12-25",{"type":7,"value":8,"toc":469},"minimark",[9,13,17,22,25,28,44,47,60,62,74,77,136,145,149,151,165,174,178,180,183,198,201,205,207,210,212,226,230,232,235,243,246,250,252,255,258,262,264,267,275,278,282,284,287,309,312,316,318,329,332,336,338,341,344,348,350,353,375,377,417,420,424,426,429,440,443,447,449,452,454,465],[10,11,5],"h1",{"id":12},"day-07-数据库70题试题-12-25",[14,15,16],"p",{},"参考重点：教材第 4 章安全性、第 5 章完整性、第 11 章恢复技术、第 12 章并发控制。",[18,19,21],"h2",{"id":20},"_12-数据库保护的四个方面各防止什么错误的发生","12. 数据库保护的四个方面各防止什么错误的发生？",[14,23,24],{},"答案：",[14,26,27],{},"数据库保护包括安全性、完整性、并发控制和恢复四方面。",[29,30,31,35,38,41],"ul",{},[32,33,34],"li",{},"安全性：防止非法用户或越权用户访问、泄露、篡改、破坏数据。",[32,36,37],{},"完整性：防止不符合语义的数据进入数据库，例如主键重复、外键悬空、成绩超过范围。",[32,39,40],{},"并发控制：防止多个事务交叉执行造成丢失修改、读脏数据、不可重复读、不一致分析。",[32,42,43],{},"恢复：防止事务故障、系统故障、介质故障后数据库停留在错误或不一致状态。",[14,45,46],{},"讲解：可以把这四类保护记成“谁能动数据、数据是否合法、多事务怎么动、出故障怎么补救”。",[18,48,50,51,55,56,59],{"id":49},"_13-试解释-commit-语句和-rollback-语句","13. 试解释 ",[52,53,54],"code",{},"COMMIT"," 语句和 ",[52,57,58],{},"ROLLBACK"," 语句。",[14,61,24],{},[29,63,64,69],{},[32,65,66,68],{},[52,67,54],{},"：提交事务，使事务对数据库所做的更新永久生效。",[32,70,71,73],{},[52,72,58],{},"：回滚事务，撤销当前事务尚未提交的全部更新，使数据库回到事务开始前的一致状态。",[14,75,76],{},"SQL Server 示例：",[78,79,84],"pre",{"className":80,"code":81,"language":82,"meta":83,"style":83},"language-sql shiki shiki-themes github-light github-dark","BEGIN TRANSACTION;\n\nUPDATE dbo.Accounts\nSET Balance = Balance - 300\nWHERE AccountNo = 'A001';\n\nCOMMIT TRANSACTION;\n-- 如果出现错误，则执行 ROLLBACK TRANSACTION;\n","sql","",[52,85,86,94,101,107,113,119,124,130],{"__ignoreMap":83},[87,88,91],"span",{"class":89,"line":90},"line",1,[87,92,93],{},"BEGIN TRANSACTION;\n",[87,95,97],{"class":89,"line":96},2,[87,98,100],{"emptyLinePlaceholder":99},true,"\n",[87,102,104],{"class":89,"line":103},3,[87,105,106],{},"UPDATE dbo.Accounts\n",[87,108,110],{"class":89,"line":109},4,[87,111,112],{},"SET Balance = Balance - 300\n",[87,114,116],{"class":89,"line":115},5,[87,117,118],{},"WHERE AccountNo = 'A001';\n",[87,120,122],{"class":89,"line":121},6,[87,123,100],{"emptyLinePlaceholder":99},[87,125,127],{"class":89,"line":126},7,[87,128,129],{},"COMMIT TRANSACTION;\n",[87,131,133],{"class":89,"line":132},8,[87,134,135],{},"-- 如果出现错误，则执行 ROLLBACK TRANSACTION;\n",[14,137,138,139,141,142,144],{},"讲解：",[52,140,54],{}," 对应持久性，",[52,143,58],{}," 对应原子性。事务失败时，已做的局部更新不能留下。",[18,146,148],{"id":147},"_14-试解释-undo-操作和-redo-操作","14. 试解释 UNDO 操作和 REDO 操作。",[14,150,24],{},[29,152,153,159],{},[32,154,155,158],{},[52,156,157],{},"UNDO","：撤销未提交或失败事务已经执行的更新，常利用日志中的旧值把数据改回去。",[32,160,161,164],{},[52,162,163],{},"REDO","：重做已提交事务的更新，常利用日志中的新值把提交结果重新写入数据库。",[14,166,167,168,170,171,173],{},"讲解：系统崩溃时，内存中已提交事务的结果可能尚未写到磁盘，所以要 ",[52,169,163],{},"；未提交事务的部分结果可能已经写到磁盘，所以要 ",[52,172,157],{},"。",[18,175,177],{"id":176},"_15-dbs-运行中一般有哪几类故障","15. DBS 运行中一般有哪几类故障？",[14,179,24],{},[14,181,182],{},"常见故障包括：",[184,185,186,189,192,195],"ol",{},[32,187,188],{},"事务故障：某个事务因逻辑错误、死锁回滚等提前终止。",[32,190,191],{},"系统故障：断电、操作系统崩溃等导致系统停止运行，但外存数据库未损坏。",[32,193,194],{},"介质故障：磁盘等外存介质损坏，导致数据库文件部分或全部丢失。",[32,196,197],{},"计算机病毒、恶意破坏或其他灾难性故障。",[14,199,200],{},"讲解：事务故障和系统故障通常可由 DBMS 自动恢复；介质故障需要后援副本和日志，往往需要 DBA 参与。",[18,202,204],{"id":203},"_16-试叙述-db-的并发控制与恢复的关系","16. 试叙述 DB 的并发控制与恢复的关系。",[14,206,24],{},[14,208,209],{},"并发控制和恢复都是为了维护数据库一致性。并发控制在正常运行时保证多个事务隔离执行，恢复在故障后保证已提交事务不丢失、未提交事务不残留。",[14,211,138],{},[29,213,214,217,220,223],{},[32,215,216],{},"并发控制解决“同时执行会不会互相干扰”。",[32,218,219],{},"恢复解决“执行中出故障后怎样回到一致状态”。",[32,221,222],{},"严格两段锁等协议能避免级联回滚，使恢复更简单。",[32,224,225],{},"日志记录必须反映事务更新顺序，才能正确 UNDO 和 REDO。",[18,227,229],{"id":228},"_17-试叙述基本封锁类型的含义","17. 试叙述基本封锁类型的含义。",[14,231,24],{},[14,233,234],{},"基本封锁类型有共享锁和排他锁。",[29,236,237,240],{},[32,238,239],{},"共享锁（S 锁）：事务对数据对象加 S 锁后，可以读该对象，其他事务也可以再加 S 锁读，但不能加 X 锁写。",[32,241,242],{},"排他锁（X 锁）：事务对数据对象加 X 锁后，可以读写该对象，其他事务不能再加 S 锁或 X 锁。",[14,244,245],{},"讲解：相容性表要记住：S-S 相容，S-X 不相容，X-X 不相容。",[18,247,249],{"id":248},"_18-有些事务只要读数据为什么要加-s-锁","18. 有些事务只要读数据，为什么要加 S 锁？",[14,251,24],{},[14,253,254],{},"只读事务加 S 锁是为了防止读到正在被其他事务修改但尚未提交的数据，也防止读的过程中数据被改掉，从而保证隔离性。",[14,256,257],{},"讲解：如果读操作不加锁，可能发生读脏数据或不可重复读。S 锁允许多个读事务并发，但会阻止写事务同时修改同一对象。",[18,259,261],{"id":260},"_19-试叙述两段锁协议","19. 试叙述两段锁协议。",[14,263,24],{},[14,265,266],{},"两段锁协议规定每个事务的封锁过程分成两个阶段：",[184,268,269,272],{},[32,270,271],{},"扩展阶段：事务可以申请并获得新的锁，但不能释放任何锁。",[32,273,274],{},"收缩阶段：事务可以释放锁，但不能再申请新的锁。",[14,276,277],{},"讲解：所有事务遵循两段锁协议时，所产生的并发调度是冲突可串行化的。两段锁协议不能保证不死锁；严格两段锁要求写锁通常保持到事务结束，可避免级联回滚。",[18,279,281],{"id":280},"_20-列举基于日志的恢复方法的实现要点","20. 列举基于日志的恢复方法的实现要点。",[14,283,24],{},[14,285,286],{},"实现要点包括：",[184,288,289,292,295,298,301],{},[32,290,291],{},"对每次更新登记日志，记录事务号、数据对象、旧值、新值等。",[32,293,294],{},"遵守先写日志原则（WAL）：更新数据页写入磁盘前，对应日志必须先写入稳定存储。",[32,296,297],{},"事务提交时必须先写入提交日志记录。",[32,299,300],{},"周期性建立检查点，减少恢复时扫描日志的范围。",[32,302,303,304,306,307,173],{},"恢复时对已提交但可能未落盘的事务执行 ",[52,305,163],{},"，对未提交事务执行 ",[52,308,157],{},[14,310,311],{},"讲解：日志是恢复的“时间线”。没有日志，就无法知道哪些修改要重做、哪些修改要撤销。",[18,313,315],{"id":314},"_21-列举三种解决死锁的常用方法","21. 列举三种解决死锁的常用方法。",[14,317,24],{},[184,319,320,323,326],{},[32,321,322],{},"死锁预防：规定资源申请顺序，或采用时间戳策略，如 wait-die、wound-wait。",[32,324,325],{},"死锁检测与解除：构造等待图，发现环后回滚某个事务释放资源。",[32,327,328],{},"超时法：事务等待超过阈值就认为可能死锁，主动回滚。",[14,330,331],{},"讲解：预防法开销可能较大但避免死锁；检测法允许死锁发生再处理；超时法简单但可能误判。",[18,333,335],{"id":334},"_22-什么叫转储转储有什么作用","22. 什么叫转储？转储有什么作用？",[14,337,24],{},[14,339,340],{},"转储是定期将数据库复制到后援存储介质上，形成数据库后援副本的过程。作用是在介质故障或严重破坏后，用后援副本和日志恢复数据库。",[14,342,343],{},"讲解：转储分静态转储和动态转储。静态转储期间不允许更新，简单但影响服务；动态转储允许并发事务执行，但必须配合日志。",[18,345,347],{"id":346},"_23-简述-dbms-实现完整性的方法","23. 简述 DBMS 实现完整性的方法。",[14,349,24],{},[14,351,352],{},"DBMS 实现完整性通常包括三步：",[184,354,355,369,372],{},[32,356,357,358,361,362,361,365,368],{},"定义完整性约束：主键、外键、",[52,359,360],{},"UNIQUE","、",[52,363,364],{},"NOT NULL",[52,366,367],{},"CHECK","、触发器等。",[32,370,371],{},"检查完整性约束：在插入、删除、修改时自动检查。",[32,373,374],{},"违约处理：拒绝操作，或按规则级联更新、级联删除、置空、置默认值。",[14,376,76],{},[78,378,380],{"className":80,"code":379,"language":82,"meta":83,"style":83},"CREATE TABLE dbo.Score (\n    Sno varchar(20) NOT NULL,\n    Cno varchar(20) NOT NULL,\n    Grade decimal(5, 2) NULL,\n    CONSTRAINT PK_Score PRIMARY KEY (Sno, Cno),\n    CONSTRAINT CK_Score_Grade CHECK (Grade BETWEEN 0 AND 100)\n);\n",[52,381,382,387,392,397,402,407,412],{"__ignoreMap":83},[87,383,384],{"class":89,"line":90},[87,385,386],{},"CREATE TABLE dbo.Score (\n",[87,388,389],{"class":89,"line":96},[87,390,391],{},"    Sno varchar(20) NOT NULL,\n",[87,393,394],{"class":89,"line":103},[87,395,396],{},"    Cno varchar(20) NOT NULL,\n",[87,398,399],{"class":89,"line":109},[87,400,401],{},"    Grade decimal(5, 2) NULL,\n",[87,403,404],{"class":89,"line":115},[87,405,406],{},"    CONSTRAINT PK_Score PRIMARY KEY (Sno, Cno),\n",[87,408,409],{"class":89,"line":121},[87,410,411],{},"    CONSTRAINT CK_Score_Grade CHECK (Grade BETWEEN 0 AND 100)\n",[87,413,414],{"class":89,"line":126},[87,415,416],{},");\n",[14,418,419],{},"讲解：完整性是“数据是否合理”的问题，不能只靠应用程序检查，应该尽量交给 DBMS 统一约束。",[18,421,423],{"id":422},"_24-试叙述完整性分类","24. 试叙述完整性分类。",[14,425,24],{},[14,427,428],{},"常见分类有：",[29,430,431,434,437],{},[32,432,433],{},"按关系模型基本规则：实体完整性、参照完整性、用户定义完整性。",[32,435,436],{},"按约束对象：属性级约束、元组级约束、关系级约束。",[32,438,439],{},"按状态变化：静态约束和动态约束。",[14,441,442],{},"讲解：考试最常考的是前三类。实体完整性约束主键，参照完整性约束外键，用户定义完整性表达具体业务规则。",[18,444,446],{"id":445},"_25-数据库安全性与完整性有什么区别","25. 数据库安全性与完整性有什么区别？",[14,448,24],{},[14,450,451],{},"安全性关注防止未授权访问和非法使用；完整性关注数据是否正确、有效、相容。",[14,453,138],{},[29,455,456,459,462],{},[32,457,458],{},"安全性问的是：“这个用户有没有资格看或改？”",[32,460,461],{},"完整性问的是：“这个数据值本身合不合法？”",[32,463,464],{},"例子：无权限用户查看成绩表是安全性问题；成绩写成 150 是完整性问题。",[466,467,468],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":83,"searchDepth":96,"depth":96,"links":470},[471,472,474,475,476,477,478,479,480,481,482,483,484,485],{"id":20,"depth":96,"text":21},{"id":49,"depth":96,"text":473},"13. 试解释 COMMIT 语句和 ROLLBACK 语句。",{"id":147,"depth":96,"text":148},{"id":176,"depth":96,"text":177},{"id":203,"depth":96,"text":204},{"id":228,"depth":96,"text":229},{"id":248,"depth":96,"text":249},{"id":260,"depth":96,"text":261},{"id":280,"depth":96,"text":281},{"id":314,"depth":96,"text":315},{"id":334,"depth":96,"text":335},{"id":346,"depth":96,"text":347},{"id":422,"depth":96,"text":423},{"id":445,"depth":96,"text":446},"md",{},"\u002Fsource\u002Fcs\u002Fdb\u002F100+70\u002Fday07-70-12-25",{"title":5,"description":16},"source\u002Fcs\u002Fdb\u002F100+70\u002FDay07-数据库70题-试题12-25","qxRHW78EF0VNtRYH4Z_9fvfqAcVtn87i1BAnytod6Mw",1793692174931]