首先,为什么需要事务?
最典型的例子是银行转账,因为不是原子性的操作(一个账号扣款,另一个账号收款),所以存在出现问题的可能,如这边扣款完毕,然后程序挂掉,收款方又没收到,这钱就蒸发了。
为了保证流程按照我们预计的执行,所以出现了事务的概念。
事务的特性:ACID。
原子性、一致性、隔离性、持久性。
注意,这是在一个事务操作中表现出来的特性,由技术手段来完成,而不是数据库真的有这些特性。
- 原子性,我的理解就是 可以将扣款和收款(或者更多操作)看作一个整体操作,如转账这个抽象操作概念,从而表现出原子性 -- 只有成功和失败。
- 一致性,我的理解就是 原子性的结果 -- 无论成功与否,转账前后两个账号的总额不变。
- 隔离性,是指与其他事务的关系,保证其他事务只能查询到本事务提交或者回滚之后的数据。
- 持久性,这个查到有两个意思:①提交后永久保存;
②保存记录,可恢复。个人倾向于第一个。
隔离级别是什么?
理论上,事务之间只要先后有序(一个事务执行完再执行另一个,也叫串行化,Serializable),就不会发生数据问题。
但是,这样显然不合适,因为先后有序会导致事务的阻塞,高并发访问时会导致很长时间没有响应。
为了解决这个问题,又出现了事务的隔离级别的概念。一般有四个级别,见下表。
隔离级别 | 脏读 | 丢失更新 | 不可重复读 | 幻读 |
未提交读:Read Uncommited | 是 | 是 | 是 | 是 |
已提交读:Read commited | 否 | 是 | 是 | 是 |
可重复读:Repeatable Read | 否 | 否 | 否 | 是 |
可串行读:Serializable | 否 | 否 | 否 | 否 |
表来自:http://blog.csdn.net/shuaihj/article/details/14163713
锁又是什么?
锁是底层的控制机制,事务通过锁来控制隔离级别。
锁有很多,大致划分为两类:悲观锁、乐观锁。更多请自行搜索。
- 所谓悲观锁,就是认为一个事务操作的数据也会被其他事务操作。
- 乐观锁相反,认为一个事务操作的数据不会被其他事务操作。
实际开发中很少直接操作锁,更多的是利用数据库提供的事务的四个隔离级别。
可以认为隔离级别是锁的一个整体打包解决方案(引用了参考链接中的原话)。
参考: