详细介绍:https://blog.csdn.net/qq_27525611/article/details/102590314
ACID
原子性、一致性、隔离性、持久性
- 一致性:事务执行前后,数据库均处于正确的状态。
- 不加锁情况下,只能保证 ACID,不能实现多线程同步。
乐观锁 & 悲观锁
悲观锁:读数据之前上锁
乐观锁:
不上锁,在写入之前检测一下数据是否有被修改;
标记是否被修改的方法有版本号、时间戳、CAS 算法。
事务的三级隔离
Read uncommitted | Read committed | Repeatable Read(默认) | Serializable(三级) | |
读取数据 | – | S 锁,读完立即释放 | 👈 | S 锁,事务结束后释放 |
修改数据 | X 锁,事务结束后释放 | 👈 | 👈 | 👈 |
更新丢失 | – | – | – | – |
脏读 | 是 | – | – | – |
不可重复读 | 是 | 是 | – | – |
幻读 | 是 | 是 | 是 | – |
脏读
select 到另一个事务未提交的值。
不可重复读
两次读取到不同的值:已读的值发生变化。
幻读
两次读取到不同的结果集:其他事务 insert 的新值。
更新丢失(2 类)
- 一个事务更新完提交后, 另一事务回滚, 造成丢失.
- 先更新的事务被后更新的事务提交的数据覆盖。