2-数据库事务与锁机制
一.事务
什么是事务???
事务就相当于一个盛放sql的容器
事务中的sql要么全部执行成功,要么所有已经修改的操作都回滚到原来的状态,即一条sql也别想执行成功
为何要用事务???
为了保证数据的安全,一致性
事务有四大特征:
1.原子性
2.一致性
3.隔离性
4.持久性:commit成功之后,就无法回滚了
start tranction——>开启事务
update employee set age=age+1 where name ='egon'
savepoint one——>设置保存点,少用
commit————>提交之后操作不能回滚,提交之前rollback回滚操作
事务运行的三种模式:
show variables like autocommit:查看事务级别
set autommit = 0:设置事务级别
自动提交事务(隐式开启,隐式提交)
隐式事务(隐式开启,显式提交)
显式事务(显式开启,显式提交)
事务的使用原则:
1.保持事务短小
2.尽量避免事务中rollback
3.尽量避免savepoint
4.显示声明打开事务
5.默认情况下,依赖于悲观锁,为吞吐量要求苛刻的事务考虑乐观锁
6.锁的行越少越好,锁的时间越短越好
二.数据库读现象——>在并发场景下,数据不安全的一种体现
读现象——>在高并发情况下,即多个并发的事务同时操作一份数据,在没有加锁处理的情况下,会引发一些奇怪的读现象
脏读:一个事务读取了其它事务还没有提交的数据,读到的是其它事务更新的数据
不可重复读:一个事务多次读取,结果不一样
幻读:一个事务读取了其它事务还没有提交的事务,只是读取的是其它事务插入的数据
三.锁介绍
什么是锁???
锁是一种保障数据的机制
为何要用锁???
以互斥锁为例,让多个并发的任务同一时间只有一个运行(注意这不是串行),牺牲效率从而保障数据安全
总锁的优缺点:
优点:保障并发场景下的数据安全
缺点:降低了效率
所以我们在使用锁时应该尽可能缩小锁的范围,即锁住的数据越少越好,并发能力越高
锁的分类:
按照粒度:行级锁,表级锁,页级锁
按照级别:共享锁,排他锁
按照使用方式:乐观锁,悲观锁
表锁:
lock table employee write:只有自己的事务有读写,其它事务无法读写
lock table employee read:所有事务都能读,但不能写
unlock tables:解锁
行锁:
select * from employee where id=1 for update:update,delete,insert等写操作事务默认是加了排他锁,保证写数据安全,本事务可以写其它事务不能写
select * from employee where id=1 lock in share mode:保证读数据一致性,加了共享锁后,其它事务只能加共享锁或不加锁