特性
- 原子性
- 一致性
- 隔离性
- 持久性
多事务同时执行问题
- 脏读
- 不可重复读
- 幻读
事务的隔离级别
- 读未提交
- 一个事务还没有提交,他的变更可以被别的事务看到
- 读已提交
- 一个事务提交以后,他的变更可以被别的事务看到
- 可重复读
- 一个事务开启以后,执行过程中看到的数据都是一致的,未提交的更改对别的事务不可见
- 串行化
- 对应一个记录会加读写锁,出现冲突时,必须要等到上一个事务提交以后才能继续执行
事务的隔离实现
- 每个事务在更新的时候都会同时记录一条回滚操作,通过回滚操作可以得到前一个状态的值(可以想象成git的提交记录,会记录每个版本的更新,方便回滚)
- 回滚日志什么时候删除:系统会判断没有事务用到这些回滚日志时(当系统里面没有比这个回滚日志更早的读视图),会自动删除
为什么长事务尽量不要用
- 长事务会导致系统里面会存在很早的事务试图,由于事务可能会访问数据库里面的任何事务,所以提交事务之前数据库里面的回滚日志都必须保留,这就会导致占用大量的存储空间