事务、视图

事务

一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位,事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

四大特性:

原子性:整个数据库事务是不可分割的单位;

一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态。在事务开始之前和结束之后,事务的完整性约束没有被破坏;

隔离性:一个事务的影响在该事务提交前对其他事务都不可见;

持久性:事务一旦提交,其结果就是永久性的。

事务的创建

隐式事务:事务没有明显的开启和结束的标记

        比如insert、update、delete语句

显式事务:事务具有明显的开启和结束的标记。如用begin transaction明确指定事务。

        前提:必须先设置自动提交功能为禁用  

步骤1:开启事务

        set autocommit=0;

        start transaction; (可选的)

步骤2:编写事务中的sql语句(select、insert、update、delete)

步骤3:结束事务

        commit;  提交事务

        rollback; 回滚事务  

        回滚到指定的地方:rollback to 回滚点名;

savepoint 结点名; 设置保存点

例:

        set autocommit=0;

        start transaction;

        delete from account where id = 25;

        savepoint a;  #设置保存点

        delete from account where id = 27;

        rollback to a;  #回滚到保存点(27未被删除)

并发事务

1.事务的并发问题是如何发生的?

   多个事务同时操作同一个数据库的相同数据时

2.并发的问题都有哪些?

   脏读:一个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据;(重点是修改,如多次读取一条记录发现其中某些列的值被修改)

   不可重复读:一个事务多次读取,结果不一样;

   幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是其他事务“插入”的数据;(重点是新增或删除,如多次读取一条记录发现记录增多或减少了)

3.如何解决并发问题

    通过设置隔离级别来解决并发问题

事务的隔离级别:

                                                  脏读                  不可重复读    幻读

Read uncommitted:读未提交    √(会发生)              √         √

Read committed: 读已提交           ×(不会)                √         √

Repeatable read: 可重复读           ×                              ×         √

Serializable:可串行化                  ×                              ×         ×

Mysql中默认第三个隔离级别 Repeatable read

Oracle中默认第二个隔离级别 Read committed

查看隔离级别

select @@tx_isolation;

设置隔离级别

set session|global transaction isolation level 隔离级别;

视图

含义:虚拟表,和普通表一样使用

应用场景:①多个地方用到同样的查询结果 ②该查询结果使用的sql语句较复杂

好处:①重用了sql语句 ②简化复杂的sql操作,不必知道它的查询细节 ③保护数据,提高安全性

           创建语法的关键字            是否实际占用物理空间                   使用

视图     create view                   占用较小,只保存sql逻辑         一般用于查询

表         create table                           保存实际的数据                    增删改查

  • 创建视图

语法:

        create view 视图名

        as

        查询语句;

例:查询平均工资最低的部门信息

        #创建视图

        create view myv

        as

        select avg(salary) ag, department_id

        from employees

        group by department_id;

        #使用视图查看工资

        select * from myv order by ag limit 1;

  • 视图的修改

方式一:

        create or replace view 视图名

        as

        查询语句;

方式二:

        alter view 视图名

        as

        查询语句;

三、删除视图

    语法:drop view 视图名,视图名,...;

四、查看视图

        desc 视图名;

        show create view 视图名;

五、视图的更新

1、插入

        insert into myv values(‘张飞’, ‘19’);

2、修改

        update myv set lastname = ‘小张’ where lastname=’张飞’;

3、删除

        delete from myv where lastname=’小张’;

具备以下特点的视图不允许更新

        ①包含以下关键字的sql语句:分组函数、distinct、group、by、having、union或union all;

        ②常量视图;

        ③select中包含子查询

        ④join (不允许插入)

        ⑤from一个不能更新的视图

        ⑥where子句的子查询引用了from子句中的表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值