1、数据库的四大特性
原子性:事务内包含的所有操作要么全部成功,要么全部失败回滚;实现:日志,将所有的更新操作全部写入日志当中,若因为一些系统奔溃/断电等原因导致事务中的部分更新操作已经执行,部分操作未执行,则通过回溯日志,将操作回滚,使系统保证原子性以及一致性;
一致性:不管任何时间有少个并发的事务,系统也必须保持一致;
隔离性:多个并发的事务的操作,在同一时间只能有一个事务执行(及串行的执行);
持久性:事务正确执行后,事务中对数据的操作不会回滚;
2、数据库四大特性之间的关系?
数据库的四大特性都是以一致性为核心的,分为数据库外部一致性与数据库内部一致性,其中外部一致性是靠编码来保证的(及在同一个事务内保证操作的完整性,如果有问题则数据库无法解决),内部一致性及事务中的操作要保证一致性:即要么全部执行要么全部不执行,且事务执行过后要永久保存一致性(单个事务的情况下);当等多个事务并发进行的情况下,仅仅保证原子性与持久性是不够的,例如并发事务a与并发事务b同时操作一个数据(同时为记录b加100),正常结果为b记录为+200,但是若在a事务操作此数据时,b事务也对此记录+100,且执行完毕,a事务执行完之后,b记录的值只+100,因为a事务将b事务的结果覆盖了即更新丢失,所以为了保证并发状态下的一致性引入了隔离性,即保证每一个事务看到的数据都是一致的,且多个事务并发执行后的状态与他们执行前的状态是等价的;
3、数据库不做隔离性导致的问题?
脏读:事务A读取了事务B未提交的数据,假如事务B未正确执行,回滚,则事务A读取到的就是脏数据;
脏读解决:读已提交------改变锁的位置,锁本来的位置是只要操作完成就释放,现在变成事务执行完成之后才会释放;
不可重复读:一个事务范围内的俩个相同的查询却得到了不同的结果(原因是查询时其他事务修改提交导致的);
更新丢失:
(1)更新丢失:俩个事务同时更新,第二个事务回滚覆盖第一个更新的结果;
(2)俩次更新:俩个事务同时更新同一个数据,第一个事务跟新成功,第二个更新失败,因为第一个覆盖了第二个的跟新结果;
幻读:同一个事务的相同的俩次查询的结果不一致(针对于记录个数);
4、幻读与不可重复读的区别?
幻读针对于记录的个数,而不可重复读针对于记录的内容;
5、隔离性的分类?
读未提交/脏读/ReadUncommitted:及读取未提交的数据,对于同一数据,一事务写时,禁止其他事务写,但是可读数据库中修改的未提交的数据;是为了解决更新丢失的问题;
读已提交/不可重复读/ReadCommitted:及只能读取已提交的数据,对于同一数据,一事务写时,禁止其他事务读写(读指的是未提交的数据);为了解决更新丢失、脏读的问题;
可重复读/RepeatableRead:对于同一数据,一事务写时禁止其他事务读,一事务读是禁止其他事务写;解决不可重复读、脏读、更新丢失的问题;
序列化读:要求事务序列化执行,事务不能并发执行,只能一个个执行,一事务写时,禁止其他事务读写,一事务读时禁止其他事务读写;(表级锁以及行级锁),解决了不可重复读、脏读、更新丢失、幻读等问题;
6、如何实现隔离性?
俩种类型的锁,乐观锁、悲观锁;
悲观锁:当前事物将所有涉及操作的对象全部加锁,操作完之后释放给其他对象使用;
乐观锁:不同的事务可以看到统一数据的不同的历史版本;如果有俩个事务同时修改了同一个数据,则较晚的事务提交时进行冲突检测;
乐观锁的实现方式:1、日志的方式;2、在内存中保存同一数据的多个历史版本,通过时间戳来区分;
7、如何设置隔离性?
(1)配置mysql.ini文件
1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
2 [mysqld]
3 transaction-isolation = REPEATABLE-READ
(2)use 数据库名;
(3)select @@tx_isolation;//查看是否设置成功,一般设置完成后需要重启mysql的服务;
8、SQL语言分类;
DQL:数据查询语言 SELECT FROM WHERE组成;
DML:数据操纵语言 UPDATE INSERT DELET组成;
DDL:数据定义语言,用来定义数据库的各种对象表、视图、索引、同义词、聚簇等;
DCL:数据控制语言,用来授予或者回收访问数据库的某种特权,并控制数据库操控事务的发生时间以及效果,对数据库实行监控;