事务具有四个属性,这些用于在事务之前和之后维护数据库的一致性。
事务属性
原子性涉及以下两个操作:
中止: 如果事务中止,则所有更改都不可见。
提交: 如果事务提交,则所有更改都是可见的。
示例: 假设事务T
跟随T1
和T2
。假设A
账户有600
元,B
由账户有300
元。将账户A
的100
转账到账户B
。
T1 | T2 |
---|---|
Read(A),A:= A-100,Write(A) | Read(B),Y:= Y+100,Write(B) |
正常情况下事务完成后,账户A
有500
元,账户B
有400
元。
如果事务T在事务T1完成之后但在事务T2完成之前失败,则金额将从账户A中扣除但不会添加到账户B。这表示数据库状态不一致。为了确保数据库状态的正确性,必须完整地执行事务。
例如: 必须在交易之前或之后维持总金额。
T发生之前的总计 = 600+300=900 T发生之后的总计 = 500+400=900
因此,数据库是一致的。 在T1
完成但T2
失败的情况下,将发生不一致。
T1
并使用数据项X
,则在事务T1
结束之前,任何其他事务T2
都不能访问该数据项。