一、SQL语句的四种分类:
- DDL:操作数据库和表的
- DML:操作表中的数据的
- DQL:查询表中的数据的
- DCL:管理用户的,进行授权之类的操作
二、事务
四大特性:
- 原子性:事务是最小不可分割的操作单位,要么一起成功,要么一起失败。
- 持久性:事务提交或回滚后,数据库会永久化保存数据。
- 隔离性:多个事务之间相互独立。
- 一致性:事务操作前后,数据的总量不变。(相当于能量守恒)
开启事务:start transaction;
提交事务:committed;
回滚事务:rollback;
事务的隔离级别:多个事务是相互独立的,隔离的,但是操作同一批数据时,会出现问题。
- 问题一:脏读:读到了另外一个事务未提交的数据(脏数据)。
- 问题二:不可重复读:一个事务中,两次读取到的数据不一样。
- 问题三:幻读:事务一使用DML语句操作所有数据,事务二添加了一条数据,事务一查不到自己的修改。
为什么会幻读,首先数据库这个软件应该是可以并发执行很多任务的,很多事务在并发进行着,因为事务二可能提交了事务,或者回滚了,那么数据库中的数据就被更改了,但是此时事务一还没提交或回滚的话,事务一种进行的操作就没了
隔离级别:
- ①read uncommitted 读未提交
出现的问题:脏读,不可重复读,幻读 - ②read committed 读已提交,一个事务不提交另一个事务读不到提交后的数据。
出现的问题:不可重复读,幻读 - ③repeatable read 可重复读,只有事务提交之后才能读取到另一个事务修改后的数据。也即两个事务都得committed。
出现的问题:幻读 - ④serializable 序列化,相当于加锁,有锁时另一个事务不会执行
出现问题:无
但是随着隔离级别提高,安全性会提高,性能会下降,所以说不是越高越好,应该设置相应的隔离级别。
MySQL数据库默认隔离级别:repeatable read,MySQL数据库没有幻读问题。
Oracle数据库默认隔离级别:read committed