首先回顾一下事务的四大特性: 原子性,一致性,隔离性,持久性
事务是与数据库交互的基本的执行单元,事务的原子性说明事务要么完全执行,要么不执行(无论一个事务有多少条命令,都要看作一个整体),不存在中间状态,
这样就避免了许多不确定的情况。
原子性举例: 以转账为例,A向B转账100元,包含两个操作 1. A的账户减少100;2. B的账户增加100,这两个操作都必须执行才能保证结果正确,其中操作1,2都是原子的,
但1和2之间是可以中断的(转账过程中到账的延迟),只要保证1,2最终都被执行即保证一致性就可以保证最后结果的正确性。
但是在并发情况下,上述情况可能就会出现错误。
为了保证并发情况下的一致性,引入了隔离性,即保证每一个事务能够看到的数据总是一致的,就是多个事务并发执行后的状态,和它们串行执行后的状态是等价的。
隔离性分为四个等级:
1 读未提交:(Read Uncommitted):会导致 脏读,不可重复读,幻读
2 读已提交(Read Committed) 大多数数据库默认的隔离级别:在1的基础上避免了脏读
3 可重复读(Repeatable-Read) mysql数据库所默认的级别:在2的基础上避免了不可重复读
4 序列化(serializable)(锁表) 可以解决所有的一致性的问题,但是效率太低
为了实现隔离性,又引入了锁的概念,锁分为悲观锁和l乐观锁。
悲观锁就是假设并发状态下数据的访问一定会出现问题,所以用所来实现互斥访问,同时为了尽可能提高性能,发明了各种粒度(数据库级/表级/行级……)的锁,以及各种性质的锁(比如 互斥锁/读锁 等)。比如上面的du
乐观锁,即不同的事务可以同时看到同一对象(一般是数据行)的不同历史版本,如果有两个事务同时修改了同一数据行,那么在较晚的事务提交时进行冲突检测。