ACID:
原子性(Atomicity): 一个事务中,所有操作全部完成或全部失败。
一致性(Consistency): 事务开始和结束之后,数据的完整性没有被破坏。
隔离性(Isolation): 允许多个事务同时对数据库进行修改和读写。
持久性(Durability): 事务结束之后,修改时永久的,不会丢失。
如果不对事务进行并发控制会产生哪些后果
- 幻读(phantom read):一个事务第二次读,读出来第一次没有的结果。
- 非重复读(nonrepeatable read):一个事务重复读两次出现不同的结果。
- 脏读(dirty read): 一个事务读取到另一个事务没有提交的修改。
- 修改丢失(lost update): 并发写入造成其中一些修改丢失。
为了解决并发控制异常, 定义了四种隔离级别
- 读未提交: 别的事务可以读取到未提交读改变。
- 读已提交:只能读取已经提交的数据。
- 可重复读:同一个事务先后查询的结果一样。
- 串行化: 事务完全串行化的执行,隔离级别最高,执行效率最低。
如何解决数据库会有数据重复问题
- 使用数据库唯一索引
- 使用队列执行异步写入
- 使用redis等实现分布式锁
乐观锁和悲观锁
- 悲观锁:先获取锁再进行操作。一锁二查三更新( select for updete)
- 乐观锁: 先修改,更新的时候发现数据已经变了就会滚(check and set) 一般通过版本号和时间戳实现。
- 需要根据响应速度、冲突频率、重试代价来判断使用哪一种。