学生应该如何讲授数据库交易?

时间:2010-10-18 10:39:45

标签: database transactions

有很多可以讲授数据库中的交易(我在这里真的是在谈论关系数据库,因为这就是我目前正在教授的内容),但我相信这很容易教错误的事情。鉴于学生很可能会在离开讲堂之前忘记你所说的大部分内容,重点应放在哪里?

教科书和演讲幻灯片中经常出现的一些关键主题是(以Ramakrishnan and Gehrke作为主要指南) - 但不要受到他们的限制:

  • ACID属性
  • 时间表及其可串行性
  • 冲突可串行化和优先级图
  • SQL事务语句(COMMIT,ROLLBACK,SAVEPOINT)
  • 锁定协议(严格2PL等)
  • 隔离级别(READ COMMITTED,REPEATABLE READ等)
  • 记录和恢复(WAL,ARIES)
  • API中的事务支持(JDBC,PHP)

我知道哪些主题最值得,哪些不是最有价值。我也对你在回答的地方感兴趣。您是否在工作中找到了一些宝贵的洞察力,或者您是否对新毕业的员工不了解某些基本细节感到沮丧?

背景:我正在向一年级IT硕士课程的学生讲授DBMS入门课程。这些学生都是计算机知识(大多数是CS)毕业生。

3 个答案:

答案 0 :(得分:4)

首先:您的重点是使用交易还是实施它们?学生的背景是什么 - 特别是,他们是否理解并发性?

我作为非数据库专家的意见,但仍然需要一直使用它们:

  • 我认为实际的 SQL语句只是一个细节;它们值得包括在实践中降低它们的威胁,但让它们自己查找语法。您可以故意使用各种语法(例如,使用API​​)来简单地说明重要的不是名称,而是事务所代表的构思和API契约。
  • 需要了解隔离级别 - 至少要达到一定程度;他们应该明白,生活并不总是可以串行化的,为什么人们会(几乎总是)选择那种障碍,以及需要注意哪些问题。哦,应该包括各种SNAPSHOT品种(我明确提到这一点,因为这些并不总是出现在讲座中,但却被广泛使用。)
  • 锁定(或缺乏锁定)显然与隔离级别相关及其优缺点。特别是,对事务的轻微看似无关的更改可能会影响获取锁的顺序,从而影响死锁的存在和不存在。在这方面,它可能很重要;但是否则它是一个实现细节(从我的角度来看)最好被忽略。
  • 就ACID而言,理解这不是一个全有或全无的事情,放弃部分以换取其他(特别是表现)的好处是非常有用的。
  • 或许可以指出 很多的应用程序使用数据库,甚至桌面应用程序,部分原因是因为数据库的简单,强大的保证使得更容易执行持久性(例如firefox或adobe reader中的sqlite)与原始I / O相比。任何进行编程的人都可能偶尔碰到数据库;几乎没有避免它:你不会想要,因为即使在非并发环境中,原子性和一致性保证也是有价值的(如果你的PC崩溃,你的lightroom数据库没有被破坏)。
  • 此外,应该清楚的是,在DB(通常)中 所有语句都是在隐式事务中执行的;你不是通过避免显式事务语句来避免事务,只是使用更多,更小的事务仍然会死锁并导致锁定或fsync开销。换句话说:如果学生想要使用数据库(他们几乎不可避免地需要这些数据库),他们就无法避免交易。

背景:我在工作和其他东西上写webapps以获得乐趣。

答案 1 :(得分:2)

我总是在“交易”的背景下提到的一点是,这个概念并不仅限于数据库。

获取交易中包含的打印机资源,其中打印了“确认单”,以及此类交易的ACID属性如何暗示:

  • 答:数据库已更新且打印了确认表,或者未打印确认表且数据库未更新。
  • c:来自不同交易的两张确认单没有混杂在一起。
  • I:在交易结束时,供纸始终位于页面顶部
  • D:在交易结束时,确认单是实际可用的,没有发生卡纸或类似情况。

另外,我没有看到任何提及两阶段提交等事情。也许你认为这是“等等”的一部分,但我认为它本身就值得一提。

答案 2 :(得分:1)

在我看来,这正是不能教的东西,我可以听到学生在阅读时打鼾。

交易的重要性 - 数据完整性。演示如何为多个语句设置显式事务,并在没有显式事务的情况下编写相同的语句。向他们展示当您不使用显式事务时数据可能会非常混乱。在你的例子的过程中涵盖像ACID这样的东西,但是在一个如何做的实际例子的上下文中使用它以便它可以工作,并且更重要的是,当你做错了会发生什么。

然后了解不同用户的交易如何相互冲突以及为什么会成为问题。讨论人们如何通过使用脏读来解决锁定问题以及为什么这是一件坏事。使用实际数据示例而不仅仅是无聊的讲座。让他们努力得到答案,而不是告诉他们。

但总是回到数据库中的数据并且它的完整性。教导实际的例子而不是讲义和Power Point,并让学生在查询数据后告诉你坏问题的问题是什么,而不是告诉他们(根据我的经验,当你强迫他们弄清楚时,他们会学到更多东西)。

顺便说一下,在你查询技巧之前,你不是在教这个吗?在查询技巧之前,不应该教授关于数据库操作(包括规范化)技术的数据库讲座,直到他们可以查询他们没有装备的数据库来理解其他任何东西,如果你从一些深奥的东西开始他们将停止听,而不是听到所有学期的事情。他们比任何其他单一事物都更需要查询技能,它应该是第一次讲座之前的事情。遗憾的是教科书不是这样编写的,这是我的想法(是的,我教过数据库)是学生离开学校对数据库一无所知的最重要因素。

对于这个讲座感到抱歉,你对我的问题感到很紧张。