事务机制与锁机制

来源:互联网 发布:明道软件使用 编辑:程序博客网 时间:2024/05/16 12:18

事务的必要性

为了避免出现数据不一致问题,需要在存储过程中引入事务的概念,将更新语句绑在一起,让它们成为一个”原子性”的操作:更新语句要么都执行,要么都不执行。

关闭MySQL自动提交的方法

  1. 显示关闭自动提交
set autocommit=0;
  1. 隐式关闭自动提交
start transaction

一般推荐使用隐式的提交方式,因为不会修改到autocommit系统变量。

关闭自动提交后,提交更新语句的方法有

相对应的,也分为显示与隐式的提交方式:
1.显示地提交:

commit;

2.隐式地提交

  • 包括了begin、set autocommit=1、start transaction、rename table、truncate
    table等语句;
  • 数据定义(create、alter、drop)function、alter procedure、drop database、drop
    table、drop function、drop index、drop procedure等语句;
  • 权限管理和账户管理语句(grant、revoke、set password、create user、drop user、rename
    user)
  • 锁语句(lock tables、unlock tables)
    更推荐用显示提交地方式。

事务处理使用方法

  • 在处理错误代码地程序中使用rollback。
  • 在具有原子性操作地地方使用start transaction隐式地关闭自动提交,并且在结束的为止上使用commit显示提交。

事务保存点的使用方法

在事务中使用savepoint 保存点名 的格式创建保存点,实现事务的”部分”提交或”部分”撤销(rollback to savepoint 保存点名)。
保存点是”临时状态”,既可以回滚到事务开始前的状态,也能决定事务的下一个状态,是介于两自动提交语句所引发状态中的一种临时状态。

锁机制的必要性

内存中的数据与外存中的数据不同步,其中的表记录之间存在“同步延迟“。

MyISAM表施加表级锁的语法格式

lock tables 表1 [as 别名] read  [local][,表2[ as 别名2][low_priority] write] ...

其中read local与read选项的差别为 READ LOCAL允许在锁定被保持时,执行非冲突性INSERT语句(同时插入)。

锁的粒度、隐式锁与显示锁、锁的类型、锁的钥匙、锁的生命周期

  • 锁的粒度指锁的作用范围
  • 多个MySQL客户机并发访问同一个数据时,为保证数据的一致性,数据库管理系统会自动地为该数据加锁、解锁,这种是隐式锁。
  • 而有时单靠隐式锁无法实现数据的一致性访问要求(例如对于临界资源的争夺上),此时需要手动地加锁、解锁,这种称为显示锁。
  • 锁的类型分为读锁(共享锁)和写锁(排他锁或独占锁)
  • 锁地钥匙:当多个MySQL客户机并发访问同一个数据时、如果MySQL客户机A对该数据成功地施加了锁,那么只有MySQL客户机A拥有这把锁的钥匙。
  • 锁的生命周期:在同一个MySQL会话内,对数据加锁到解锁之间的时间间隔。锁的生命周期越长,并发访问性能越低;锁的生命周期越短,并发访问性能越高。

InnoDB表施加行级锁的语法格式

  • 共享锁 select * from 表 where 条件语句 lock in share mode;
  • 排他锁 select * from 表 where 条件语句 for update;

InnoDB中的间隙锁、记录锁

当检索条件满足某区间范围,但表中不存在的记录,此时也有共享锁或排他锁,即行级锁会锁定相邻的键,这种机制就是间隙锁(next-key锁)
事务隔离级别设置为repeatable read,此时InnoDB表施加行级锁,默认使用间隔锁(需要索引),当事务的隔离级别设置为read uncommited或者read commited,此时InnoDB表施加行级锁,默认情况下使用记录锁(record lock)。
与间隙锁不同,记录锁仅仅为满足该查询范围的记录施加共享锁或排他锁。

锁等待与死锁

  • 锁等待是为了保证事务可以正常地并发运行,锁等待不一定导致死锁问题的发生。
  • 而死锁问题的发生一定伴随着锁等待现象。

MySQL支持的事务隔离级别

4种:

  1. read uncommited –> 读”脏”数据现象
  2. read commited –> 不可重复读现象
  3. repeatable read(MySQL默认)–>幻读现象
  4. serializable
0 0