【数据库】数据库索引、数据库事务的隔离级别

数据库索引

索引的概念

为了快速查找,在频繁使用的过滤字段添加一个二分查找树,一般称为B树,但mysql用的是B+树

 

创建索引(B + 树索引) 

--查询时用索引字段过滤时,会使用到索引
-- 为了在频繁使用的过滤字段添加一个二分查找树, 
-- 一般称为B树,在mysql用的是B + 树。 

create index aaa on emp(ename);
select * from emp where ename = 'SMITH';
​

 

 

 

 

视图

在单表中创建视图

视图本身不存数据,他只是存查询的东西。 以后在别人想要查询表中信息时, 就不用再将表中对象的各个参数名列出来了。

create view vemp as select empno,ename,job,mgr,sal,comm from emp where sal  > 2000;
select * from vemp;

 

 

 

数据库操作:事务

如:银行转帐1000,是两个更新操作,1.把自己帐号的存款金额改为减少1000,2.把对方存款改为增加1000

事务(transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。 事务的ACID特性:

  • 原子性(atomicity)

  • 一致性(consistency)

  • 隔离性(isolation)

  • 持久性(durability)

事务的并发性是指多个事务的并行操作轮流交叉运行,事务的并发可能会访问和存储不正确的数据,破坏交易的隔离性和数据库的一致性。

-- 创建事务 
create table Account (
    id int primary key,
    account int,
    acciont_name varchar (50)
);
-- 插入事务对象 

insert into Account (id, account, acciont_name)
value
    (1, 5000, '张三');

insert into Account (id, account, acciont_name)
value
    (2, 5000, '李四');

--查询 

select * from Account;





第一种开启事务的方式 显式声明

rollback:回滚,事务的中间状态, 作用是使事务回到事务开启之前的状态,且不让其他人看到的性质为,隔离性。 且每次执行回滚后,如果不begin就无法再开启事务。 即这是一整套操作,必须从头开始。

commit:事务提交,将回滚段的数据直接更新到数据段。

begin; -- 开启事务
update Account set account=account - 1000 where id=1; --更新一个帐号
update Account set account=account + 1000 where id=2; -- 更新另一个帐号
rollback; -- 回滚 回复到开启事务前的状态
commit; -- 提交 只有执行提交,前面的操作才真正存在数据库中
select * from Account;

 


第二种开启事务的方式 隐式声明

事实上数据库每执行一条添、删、改的操作时,没开启事务的话,是默认提交的。 设置自动提交为0,就是默认开启事务,不自动提交。 为1默认自动提交。

注意,如果上面设置为不自动提交,那么事务是不会被更新到数据段的。 到我们去查询数据时,我们看到的仍然是之前回滚段上面的数据。

set autocommit = 0;

update Account set account = account - 1000 where id = 1;

update Account set account = account + 1000 where id = 2;

rollback;

select * from Account;

 

设置回滚段保存点

当数据较大时,我们就需要设置保存点,一般为1万个数据为单位。

当我们回滚到相应的保存点上时,我们刷新所看到数据就是该保存点之前的回滚数据数据。

set autocommit= 0; 

update Account set account=account - 1000 where id=1; 
update Account set account=account + 1000 where id=2; 
savepoint aa;
update Account set account=account - 1000 where id=1;
update Account set account=account + 1000 where id=2; 
savepoint bb;
update Account set account=account - 1000 where id=1; 
update Account set account=account + 1000 where id=2; 

rollback to aa;--回滚到aa事务保存点
rollback to bb;--回滚到bb事务保存点
rollback;--回滚
commit;

select * from Account;

 

 

事务的隔离级别

1、事务的并发问题

  1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

  2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

  3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

2、隔离级别

事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

我们可以用下列语句查询当前数据库的事务隔离级别

select @@tx_isolation;


--如果需要,可以用下面语句设置数据库的隔离级别
set session transaction isolation level read committed;
select @@tx_isolation;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_浮舍_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值