温故知新之 数据库的事务、隔离级别、锁

首先,为什么需要事务?

最典型的例子是银行转账,因为不是原子性的操作(一个账号扣款,另一个账号收款),所以存在出现问题的可能,如这边扣款完毕,然后程序挂掉,收款方又没收到,这钱就蒸发了。

为了保证流程按照我们预计的执行,所以出现了事务的概念。

事务的特性:ACID。

原子性、一致性、隔离性、持久性。

注意,这是在一个事务操作中表现出来的特性,由技术手段来完成,而不是数据库真的有这些特性。

  • 原子性,我的理解就是 可以将扣款和收款(或者更多操作)看作一个整体操作,如转账这个抽象操作概念,从而表现出原子性 -- 只有成功和失败。
  • 一致性,我的理解就是 原子性的结果 -- 无论成功与否,转账前后两个账号的总额不变。
  • 隔离性,是指与其他事务的关系,保证其他事务只能查询到本事务提交或者回滚之后的数据。
  • 持久性,这个查到有两个意思:①提交后永久保存; ②保存记录,可恢复。个人倾向于第一个。

隔离级别是什么?

理论上,事务之间只要先后有序(一个事务执行完再执行另一个,也叫串行化,Serializable),就不会发生数据问题。

但是,这样显然不合适,因为先后有序会导致事务的阻塞,高并发访问时会导致很长时间没有响应。

为了解决这个问题,又出现了事务的隔离级别的概念。一般有四个级别,见下表。

隔离级别

脏读

丢失更新

不可重复读

幻读

未提交读:Read Uncommited

已提交读:Read commited

可重复读:Repeatable Read

可串行读:Serializable

表来自:http://blog.csdn.net/shuaihj/article/details/14163713

锁又是什么?

锁是底层的控制机制,事务通过锁来控制隔离级别。

锁有很多,大致划分为两类:悲观锁、乐观锁。更多请自行搜索。

  • 所谓悲观锁,就是认为一个事务操作的数据也会被其他事务操作。
  • 乐观锁相反,认为一个事务操作的数据不会被其他事务操作。

实际开发中很少直接操作锁,更多的是利用数据库提供的事务的四个隔离级别。

可以认为隔离级别是锁的一个整体打包解决方案(引用了参考链接中的原话)。

参考:

http://blog.csdn.net/bjyfb/article/details/44022995

原文地址:https://www.cnblogs.com/larryzeal/p/6278969.html