数据库学习(四)——事务处理
@
目录
一、事务简介
1.正常的commit,自动提交
commit;
2.rollback
delete from xxx where xx;
delete from xxx where xx;
savepoint sp1;
delete from xxx where xx;
rollback to sp1;
3.事务的ACID特性
A:原子性,操作集合不可分割
C:一致性,经过N个操作,数据状态不会改变
I:隔离性,隔离性会导致效率降低,为了提高程序效率,可以设置隔离级别
隔离级别:读未提交,读已提交,可重复度,序列化
数据不一致问题:脏读、不可重复读、幻读
D:持久性,所有数据修改持久化到介质中,不会因为程序关闭,导致丢失
4.事务的特性中,哪个是最关键的?
所有特性,都是为了保证一致性,一致性是最终的追求。
一致性是通过原子性,隔离性,持久性保证的。
5.锁的机制:
为了解决并发访问,数据不一致,加锁得考虑粒度,
锁的粒度越小,效率越高,粒度越大,效率越低,大部分都是行级锁
二、脏读、幻读、不可重复读测试
1.打开命令行
select @@autocommit
set autocommit=0
2.数据准备
create database tran;
use tran;
create table psn(id int primary key,name varchar(10)) engine=innodb;
insert into psn values(1,"zhangsan");
insert into psn values(2,"lisi");
insert into psn values(3,"wangwu");
commit;
3.测试事务
--事务包含四个隔离级别:(从上往下隔离级别越来越高
read uncommitted; --读未提交
read commited; --读已提交
repeatable read; --可重复读
(seriable) --序列化执行,串行
4.测试1:模拟读未提交产生脏读
set session transaction isolation level read uncommitted;
A:start transaction;
B:start transaction;
A:select * from psn;
B:select * from psn;
A:update psn set name='msb'
--读取结果为msb,产生脏读,因为A事务没有commit
A:commit
B:select * from psn;
--此时读取的数据是msb,正常读取
这时候,我们两个表进行比较,发现,数据不一致了,产生脏读现象
5.测试2:模拟不可重复读
set session transaction isolation level read committed;
A:start transaction;
B:start transaction;
A:update psn set name='ppp'
B:select * from psn;
A:commit;
B:select * from psn;
这时候用AB进行查询,发现脏读没有了,但是出现不可重复读,因为在一次事务中,B读出了2个不一样的数据
6.测试3:模拟幻读
set session transaction isolation level repeatable read;
A:start transaction;
B:start transaction;
A:update psn set name='lisi'
B:select * from psn;
A:commit;
B:select * from psn;
这是候已经提交,但是B产生幻觉,还是之前数据,所以称为幻读。
7.总结表
隔离级别 | 异常情况 |
---|---|
读未提交 | 脏读,重复读,幻读 |
读已提交 | 重复读,幻读 |
不可重复读 | 幻读 |
序列化 |