数据库
事务的ACID特性
原子性 逻辑上是不可分割的操作单元,事务的所有操作要么全部提交成功,要么全部失败回滚(用回滚日志实现,反向执行日志中的操作);
一致性 事务的执行必须使数据库保持一致性状态,在一致性状态下,所有
隔离性 一个事物所做的修改在最终提交以前,对其他事务是不可见的。
持久性 一旦事物提交成功,对数据的修改是永久性的
会出现哪些并发一致性问题?
- 丢失修改: 一个事务对数据进行了修改,在事务提交之前,另一个事务对同一个数据进行了修改,覆盖了之前的修改。
- 脏读: 一个事务读取了被另外一个事务修改,但未提交(进行了回滚)的数据,造成两个事物得到的数据不一致;
- 不可重复读 :在同一个事物中,某查询操作在一个时间读取某一行数据和之后一个时间读取该行数据,发现数据已经发生修改(针对update操作)
- 幻读 :当同一查询多次执行时,由于其它事物在这个数据范围内执行了插入操作,会导致每次返回不同的结果集(和不可重复读的区别:针对的是一个数据整体/范围;并针对insert)
数据库的四种隔离级别
- 未提交读 在一个事物提交之前,它的执行结果对其他事物也是可见的。会导致脏读,不可重复读,幻读
- 提交读 一个事物只能空间已经提交的事务所作的改变。可避免脏读问题。
- 可重复读 可以确保同一个事务在多次读取同样的数据时得到相同的结果。可避免不可重复读
- 可串行化 强制事务所执行,使之不可能相互冲突,从而解决幻读问题。可能导致大量的超时现象和锁竞争,实际很少使用