什么是事务?
一个事务是一个完整的业务逻辑单元,不可再分。
下面举个例子说明:
例如:银行账户转账,a给b转账1000,需要执行两条update语句。
Update t_act set balance=balance-1000 where actno=’act-01’
Update t_act set balance=balance+1000 where actno=’act-02’
要保证两条DML语句必须同时成功与失败,则需要使用数据库的“事务机制”。
和事务相关的只有:DML语句(insert delete update),通常一个业务(事务)要多条DML语句共同完成。
事务的特性
事务的特性包含:ACID
A:原子性:一次操作是不可分割的,要么全部成功,要么全部失败。(undo log保证)
C:一致性:简单一点说就是数据执行前后都要处于一种合法的状态。(由其他三大特性以及程序 员编写业务代码来保证)
I:隔离性:多个事务并发执行的时候,事务内部的操作与其他事务是隔离的,并发执行的各个事务 之间不能互相干扰。(通过锁与MVCC来保证)
D:持久性:事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应 该对其有任何影响。(内存+redo log保证)
事务的隔离级别
事务存在隔离级别,理论上有4个级别:
第一级别:读未提交(read uncommitted)
对方事务还未提交,我们当前事务可以读取对方未提交的事务的数据。
存在脏读(Dirty Read)现象:表示读到了脏数据。指的是读到了其他事务未提交的数据, 未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。
第二级别:读已提交(read committed)
对方事务提交之后我们可以读取到。
解决了:脏读现象。
存在不可重复读现象:即同一事务的数据在不同时候去读取,每次读到的数据不一样。这是因为可能会受到其他事务的影响,比如其他事务修改了这批数据并提交了。
第三级别:可重复读(repeatable read)
对方事务提交之后我们读取不到。
解决了:不可重复读。
存在幻读现象:简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control 间隙锁)机制解决了该问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题。
幻读的结果其实和不可重复读是一样的表现,差异就在于,不可重复读,主要是针对其他事务进行了编辑(update)和删除(delete)操作。而幻读主要是针对插入(insert)操作。也就是在一个事务生命周期内,会查询到另外一个事务新插入的数据。
第四级别:序列化读/串行化读(Serializable)
解决所有问题。
但效率低。需要事务排队。
简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
Oracle数据库默认的隔离等级为:读已提交
Mysql数据库默认的隔离级别是:可重复读
mysql事务默认情况下是自动提交。(即只要执行一条DML语句,就提交一次)
怎么关闭自动提交: start transaction
关闭自动提交后,需要手动提交:committed
什么是视图?
视图:可理解为站在不同的角度去看到数据。(同一张表的数据,通过不同的角度去看待)
怎么创建视图: create view myview as select empno,ename from emp;
怎么删除视图: drop view myview;
注意:只有DQL语句才能以视图对象的方式创建出来。
对视图进行增删改查,会影响到原表数据。(通过视图影响原表数据的,不是直接操作原表)
视图的作用:
视图可以隐藏表的实现细节。保密级别较高的系统,数据库只对外提供相关的视图,java程序员只对视图对象进行CRUD。
例子:
Create table emp_bak as select * from emp;
Create view myview as select empno,ename,sal from emp_bak; //创建了视图
Update myview set ename=’hh’,sal=1 where empno=7369; //通过视图修改了原表数据
Delete from myview where empno=7369 //通过视图删除原表数据