加锁的目的在于实现事物ACID特性中的隔离性,在并发访问的时候,保证各个操作之间不会造成相互影响。
一个支持事务(Transaction)的数据库,必须要具有ACID这四种特性,否则在事务过程当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
注:在单机环境下,事务遵循ACID特性,但是在分布式事务中,ACID已经不能保证事务的有效性,还需要遵循CAP和BASE理论。
原子性(Atomicity)
整个事务中所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
原子性实现:undo log
一致性(Consistency)
事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
在事务的四个特点中,一致性是事务的根本追求,而在某些情况下会对一致性造成破坏:
1、事务的并发执行
2、事务故障或系统故障
数据库系统通过并发控制技术和日志恢复技术来避免这种情况的发生:
1、并发控制技术(加锁+无锁MVCC)保证了事务的隔离性,使数据库的一致性状态不会因为并发执行的操作被破坏;
2、日志恢复技术保证了事务的原子性,使一致性状态不会因事务或系统故障被破坏。同时使已提交的数据库的修改不会因系统崩溃而丢失,保证了事务的持久性。
实现机制:原子性,隔离性,持久性
隔离性(Isolation)
隔离状态执行事务,使他们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一个事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或者序列化请求,使得在同一时间仅有一个请求用于同一数据。
实现机制:读写锁+MVCC(不加锁)
持久性(Durability)
在事务完成以后,该事务对数据库所作的变更会持久地保存在数据库之中,并不会被回滚。
实现机制:redo log重做日志