事务属性2024年12月8日 | 7 分钟阅读 从事务的定义可以清楚地看出,单个事务可能包含一系列在数据库内部执行的操作。一旦事务被提交,它应该执行所有属于它的操作,并在最终完成时,通知用户成功或失败以及事务对数据库所做的更改。 当多个用户并发地(即同时)提交事务时,由于事务的重叠,数据库可能会出现不一致的状态。因此,为了在并发访问和系统故障的情况下实现数据完整性,事务应该具有原子性、一致性、隔离性和持久性。这些属性被称为ACID属性,取自每个属性的首字母。 什么是事务? 事务是构成单个逻辑工作单元的一系列操作的集合。事务有四个属性。这些属性用于在事务执行前后维护数据库的一致性。构成事务的各种操作通常包括添加新数据、修改现有数据、访问现有数据或这些操作的组合。ACID属性如下: 事务的属性
![]() 原子性
原子性属性的特点
原子性涉及以下两个操作: 中止(Abort): 如果一个事务中止,那么它所做的所有更改都不可见。 提交(Commit): 如果一个事务提交,那么它所做的所有更改都可见。 示例: 让我们假设有以下事务T,由T1和T2组成。A账户有600元,B账户有300元。将100元从A账户转到B账户。
事务完成后,A账户有500元,B账户有400元。 如果事务T在完成事务T1之后但在完成事务T2之前失败,那么金额将从A账户扣除,但不会添加到B账户。这显示了数据库的不一致状态。为了确保数据库状态的正确性,事务必须被完整地执行。 维护原子性的机制是由DBMS完成的,它会跟踪执行写入操作的数据的旧值,如果事务没有完成其执行,旧值将被恢复,就好像该事务从未被执行过一样。 一致性
例如: 总金额必须在事务前后保持不变。 因此,数据库是一致的。在T1完成但T2失败的情况下,就会出现不一致。 没有一致性属性,事务可能会错误地贷记或借记资金。编写事务代码的应用程序员有责任通过在数据库上强制执行一致性约束来为单个事务维护一致性。 隔离
实现隔离性 当多个事务并发执行时,即使每个事务都满足原子性和一致性属性,也可能出现问题。这些问题是由于并发运行的事务重叠造成的,即当事务相互干扰时。 示例: 现在让我们考虑两个并发执行的事务T1和T2。事务T1从账户A向账户B转账750元,事务T2从账户A向账户B转账20%的金额。假设最初账户A和B的余额分别为5000元和8000元。 现在,事务T1和T2并发运行的调度如下图所示
调度2:不一致状态
调度1导致了数据库的一致状态,因为它显示了在事务执行前后,账户A和B的总和为13000元。 现在考虑调度2,其中事务T1对账户A执行了写操作,将其值更新为4250元,即从账户A减少了750元。在此期间,另一个事务T2读取了账户A的余额,即5000元。 现在它计算账户A金额的20%,并将其存储在临时变量temp中。然后,它通过从账户A的初始余额5000元中扣除临时变量的值1000元,将账户A的余额更新为4000元。现在它也读取了账户B的余额。在进一步执行之前,事务T1获得控制权并对账户A执行写操作。现在事务T1和账户B中的余额值,因此它将B的值更新为9000元,而不是9750元。因此,账户A和B的总和变为13250元 = (4250 + 9000),这导致了不一致,因为它应该是13000元。 解决上述问题的一种可能方法是串行执行上述事务,即一个接一个地执行。但这也可能导致问题。假设一个长事务首先被执行,那么所有其他事务都必须在队列中等待,即使某些事务彼此不干扰。因此,对于这样的事务,没有必要在队列中等待。 然而,并发执行一组事务可以提供性能上的好处。因此,DBMS已经开发了其他解决方案,允许在没有任何问题的情况下并发执行多个事务。调度1中解释了一种可能的方法。这是隔离性属性的要求,它要求在一个事务执行期间使用的数据不能被第二个事务使用,直到第一个事务完成。隔离性属性由DBMS的并发控制组件处理。 耐用性
DBMS维护一个称为日志的记录,它跟踪对数据库的所有写入操作。日志有助于确保持久性。如果系统在已完成的事务所做的更改写入磁盘之前崩溃,当系统重新启动时,日志将用于记住这些更改。 下一主题DBMS 事务状态 |
我们请求您订阅我们的新闻通讯以获取最新更新。