事务
事务【一系列的操作序列】(逻辑工作单位):是维护数据库的完整性,保证一系列的SQL语句要么全部执行,要么全不执行;(例如:用户A 给用户B转账,首先A的卡要减去你转账的金额,B的卡要加上你转账的金额,这才是转账成功。这是一个完整的过程,所以可以称之为一个事务。)
单单一条SQL语句可以称之为事务吗?不是
事务特点
原子性:操作序列不可拆分,例如上面的转账。
一致性:事务执行的结果必须从一种一致性转换为另外一种一种性,也就是只有转账减去的金额和加上的金额是一样的,才可以保证一致性。(你可以想象一下,你给B转账了100000元,但是B只接收到了100元,这就不一致了。如果是这样就不是转账了,你就应该拨打110报警电话了~~)
隔离性:事务之间是相互独立的,执行互不干扰。
持久性:事务一旦执行完毕,所有的记录(或数据的操作/改变),永久保存在存储器中(常规为物理存储器)。
回滚
数据未提交才可以进行回滚。
事务的持久性和回滚也存在一定关系
模拟转账操作
以下的操作是为了模拟转账的操作(使用的是SQL语句,也为了练习SQL的基本语句)
数据概念(脏读、不可重复、幻读、更新丢失)
脏读: (针对未提交的数据)就是指当一个 事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个 事务读到的这个数据是 脏数据,依据脏数据所做的操作可能是不正确的。
幻读: 一个事务按照相同的查询条件查询之前检索的数据,却发现检索的集条数表多或者变少,类似产生幻觉。
不可重复读取:(读取数据本身的对比)一个事务再读取某些数据后的一段时间后,再次读取这个数据,发现其读取出来的数据内容已经发生了改变,这是不可重复读。
**更新丢失:**最后的更新覆盖了其他事物之前的更新,而事物之间并不知道发生更新丢失。更新丢失完全可以避免,应用对访问的数据加锁即可。
隔离级别
READ UNCOMMITTED(读未提交) :最高效率,最低效率(忽略安全)。
READ COMMITTED(读已提交):允许不可重复的问题和幻读。强调效率大于安全。
REPEATABLE READ(可重复读):允许出现幻读,强调安全大于效率。
SERIALIZABLE(序列化):强调了并发安全性,最低效率(忽略效率)。
设置隔离级别的原因
数据的交叉读取导致了脏读、不可重复、幻读。而设置隔离级别,就是SQL建立的解决问题的方式。
一共有四个级别。
视图
视图:从一张表或多张表或其他视图中构建出来的虚拟表。
视图在数据库中的存在形式
视图里存放的是动态检索的语句。只是存了动作。
创建视图
索引
数据库索引是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。数据库索引就是为了提高表的搜索效率而对某些字段中的值建立的目录。
索引是占用空间的,是用空间换取时间,因为索引可以提高查询效率。
索引是不是越多越好呢? 不是(占用的空间越来越多,进行添加、更改、删除等操作也会浪费更多的时间)
索引里保存指向的具体的信息。
索引一旦建立,系统自动去用。
建立索引