MySQL的事务与视图简单学习总结

事务是数据库操作的基本单位,确保业务逻辑的原子性、一致性、隔离性和持久性。ACID特性包括原子性、一致性、隔离性和持久性。事务隔离级别有四种,从读未提交到序列化读,各有利弊。视图则提供了不同角度查看数据的机制,可以隐藏表的细节,更新视图会影响原表数据。MySQL默认隔离级别为可重复读,Oracle为读已提交。
摘要由CSDN通过智能技术生成

什么是事务?

一个事务是一个完整的业务逻辑单元,不可再分。

下面举个例子说明:

      例如:银行账户转账,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   //通过视图删除原表数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值