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:保证读数据一致性,加了共享锁后,其它事务只能加共享锁或不加锁