我试图了解更多关于数据库事务的知识,我找到了用于编写事务的ACID原则,并想到了一些问题。
ACID原则:
一个事务必须是:
- 原子性 - 它是一个工作单元,不依赖于前一个和下一个事务。
- 一致性 - 数据要么提交或回滚,没有“中间状态” ,其中某些数据已被更新而其他部分没有。
- 隔离性 - 没有事务看到当前事务的中间结果。
- 持久性 - 如果数据已经提交,则其值持久存在,即使系统在此后崩溃。
我想知道它们在底层是如何工作的,以便我可以更好地理解编写此类事务时需要考虑的因素。我猜具体细节会因可用的数据库实现而异,但某些规则将始终存在。
- 数据库如何处理并发事务,同时仍支持原子规则?
- 是否有一个按顺序处理的事务队列?
- 如何处理阻塞所有其他事务的长时间事务?
- 对表的更新是否在内存中完成,因此如果在提交之前发生崩溃,则不会对数据库进行任何更改?
- 还是有一些中间表会被更新以使其在崩溃后仍然存在?
- 当事务正在进行时,是否防止所有读写访问所涉及的表?
- 还是数据库允许写入,但事务将在提交时覆盖所有更改?