database - 应向学生教授有关数据库事务的哪些内容?

标签 database transactions

<分区>

关于数据库中的事务,可以教授很多东西(我在这里真正谈论的是关系数据库,因为这就是我目前正在教授的内容),但我相信教授错误的事情。鉴于学生在离开教室之前很可能会忘记您所说的大部分内容,那么应该将注意力放在哪里?

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

  • 酸性物质
  • 时间表及其可序列化
  • 冲突序列化和优先级图
  • SQL 事务语句(COMMIT、ROLLBACK、SAVEPOINT)
  • 锁定协议(protocol)(严格的 2PL 等)
  • 隔离级别(READ COMMITTED、REPEATABLE READ 等)
  • 日志记录和恢复(WAL、ARIES)
  • API(JDBC、PHP)中的事务支持

我希望了解哪些主题最值得,哪些不值得。我也对您从哪里回答问题感兴趣。您是否发现了一些在工作中非常宝贵的洞察力,或者您是否因为新毕业的员工不了解一些基本细节而感到沮丧?

背景:我在 DBMS 入门类(class)中向 1 年 IT 硕士类(class)的学生讲授该主题。学生是精通计算机(主要是 CS)的毕业生。

最佳答案

首先:您的重点是使用交易还是实现交易?学生的背景如何 - 特别是,他们了解并发性吗?

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

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

背景:我在工作中编写 webapps 和其他一些有趣的东西。

关于database - 应向学生教授有关数据库事务的哪些内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3958324/

相关文章:

c# - 通用存储库和事务

c# - 事务中的 EF 更新窗体 View

mysql - 如何在 MySQL 中定义延迟约束

database - 寻找用于持久性的分布式键值数据库

java - 2 个线程 vs 2 个进程(设计/性能/隔离)

mysql - 为什么锁定读取忽略隔离级别?

java - Singleton 中具有上下文类型 TRANSACTION 的 EntityManager 是否会加入外部 bean 管理的事务?

python - 我应该如何在 django admin 中表示一个 bit flags int 字段?

mysql - 数据库更新速度更快?

c# - TransactionScope 破坏 SqlConnection 池?