数据库学习(四)——事务处理
@
一、事务简介
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.总结表
隔离级别 | 异常情况 |
---|---|
读未提交 | 脏读,重复读,幻读 |
读已提交 | 重复读,幻读 |
不可重复读 | 幻读 |
序列化 |