今日内容:1、事务
2、数据库读现象
3、数据库锁机制
一 事务
什么是事务
事务就相当于一个盛放sql的容器
事务中的sql要么全部执行成功,要么所有已经修改的操作都混滚到原来的状态,即一条sql也别想执行成功
为何要用事务
为了保证数据的安全、一致性
事务有四大特性:
1、原子性(Atomicity)2、一致性(Consistency)3、隔离性(Isolation)4、持久性(Durability):第7个commit成功之后,就无法回滚了
try:begin;
update user set balance=900 where name='wsb'; #买支付100元
update user set balance=1010 where name='egon'; #中介拿走10元
uppdate user set balance=1090 where name='ysb'; #卖家拿到90元,出现异常没有拿到
except 异常:
rollback;
else:
commit;
事务的保存点
begin;
update employee set name="EGON_NB" where id=1;
update employee set name="ALEX_SB" where id=2;
update employee set name="WXX" where id=3;
savepoint one;
select * from employee;
update employee set name="yxx_sb" where id=4;
update employee set name="lxx" where id=5;
savepoint two;
insert into employee values(19,"egonxxx",19);
savepoint three;
二 数据库读现象-》在并发场景下,数据不安全的一种体现
读现象---》在并发场景下,并发的多个事务去操作同一份数据,而产生的一些奇怪的读现象
在高并发情况下,即多个并发的事务同时操作一份数据,在没有加锁处理的情况下,会引发一些奇怪的读现象
脏读
不可重复读
幻读
三 锁介绍
什么是锁:
锁是一种保障数据的机制,如何保障?
为何要用锁?
以互斥锁为例,让多个并发的任务同一时间只有一个运行(注意这不是串行),牺牲了效率但换来数据安全
总锁的优缺点:
优点: 保障并发场景下的数据安全
缺点:降低了效率
所以我们在使用锁时应该尽可能缩小锁的范围,即锁住的数据越少越好,并发能力越高
锁的分类:
按照粒度:行级锁、表级锁、页级锁。
按照级别:共享锁、排他锁
按照使用方式分:乐观锁、悲观锁
锁的使用:
事务一对id=3的行加了互斥锁之后,其它事务对id=3行不能加任何锁(写不行,但是可以读)
事务一对id=3的行加了共享锁之后,其它事务对id=3行只能加共享锁,或者不加锁(写不行,但可以读)
1
5----
7----
9
11
12