数据库事务与锁机制
一.事务
什么是事务???
事务就相当于一个盛放sql的容器
事务中的sql要么全部执行成功,要么所有已经修改的操作都回滚到原来的状态,即一条sql也别想执行成功
为何要用事务???
为了保证数据的安全,一致性
事务有四大特征:
1.原子性
一个事务是一个不可分隔的单位,事务中包含的诸多操作,要么同时成功要么同时失败
2.一致性
事务必须是使数据库从一个一致性的状态变到另外一个一致性的状态,一致性跟原子性是密切相关的
3.隔离性
一个事务的执行不能被其它事务干扰
4.持久性:commit成功之后,就无法回滚了
start transaction——>开启事务
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:保证读数据一致性,加了共享锁后,其它事务只能加共享锁或不加锁