数据库搜索引擎InnoDB与MyISAM,其他的暂不考虑;
数据库的四大特性:
原子性、隔离性、一致性、持久性;
InnoDB下事务原理:
使用redo log(重做日志)保证事务的持久性,使用undo log(回滚日志)来保证书屋的原子性;
通过锁机制、MVCC等手段来保证事务的隔离性;保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障;
多个事务并发运行时,可能会导致以下问题:
脏读:当一个事务正在访问数据并且对数据进行了修改,而修改还未提交到数据库中,这时另一个事务也访问了这个数据,然后使用
了这个数据。因为这个数据还未提交,另一个事务读到的这个数据就是脏数据;
丢失修改:指一个事务读取一个数据时,另一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了
这个数据。这样第一个事务内的修改结果就被丢失;
不可重复读:指在一个事务内多次读同一个数据,在这个事务还未结束时,另一个事务也访问该数据。在第一个事务中的两次读数据
之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样;
幻读:幻读和不可重复读类似。一个事务读取了几行数据,接着另一个并发事务插入了一些数据时。在随后的查询中,第一个事务就
会多了一些原本不存在的记录,就像发生了幻觉一样;
不可重复读和幻读区别:
不可重复读的重点是修改,比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除,比如多次读
取一条记录发现记录增多或者减少了;
sql标准定义了四个隔离级别:
READ-UNCOMMITTED(读取未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读;
READ-COMMITTED(读取已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或者不可重复读仍有可能发生;
REPEATABLE-READ(可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事务所修改,可以阻止脏读和不可
重复读,但幻读仍有可能发生;
SERIALIZABLE(可串行化):最高的隔离级别,完全服从ACID的隔离级别。所有事务一次逐个执行,事务之间完全不可能产生干扰;
mysql的默认隔离级别:
InnoDB存储引擎的默认支持的隔离级别是REPEATABLE-READ(可重复读);
隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是读取提交内容,但是InnoDB存储引擎默认使用REPEATABLE-READ
(可重复读)并不会也有任何性能损失;InnoDB存储引擎在分布式事务的情况下一般会用到最高的SERIALIZABLE(可串行化)隔离级别;
binlog:数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性;