mysql事务,锁

事务

事务是必须满足4个条件(ACID): Atomicity(原子性或不可分割性)、Consistency(一致性)、Isolation(隔离性或独立性)、Durability(持久性)

  1. 原子性:一组事务,要么成功;要么撤回,即事务在执行过程中出错会回滚到事务开始前的状态。
  2. 一致性: 一个事务不论是开始前还是结束后,数据库的完整性都没有被破坏。因此写入的数据必须完全符合所有预设规则(资料精确度、串联性以及后续数据库能够自发完成预定工作)。
  3. 隔离性:数据库允许多个事务并发的同时对其数据进行读写修改等操作,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离可分为:Read uncommitted(读未提交)、Read committed(读提交)、Repeatable read(可重复读)、Serializable(串行化)。
  4. 持久性:事务在处理结束后对数据做出的修改是永久的,无法丢失

MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。

事务用来管理 insert , update , delete 语句。

事务控制语句

  1. 显式的开始一个事务:

    1
    2
    3
    start transaction

    begin
  2. 做保存点,一个事务中可以有多个保存点:

    1
    savepoint 保存点名称
  3. 提交事务,并使数据库中进行的所有修改成为永久性的:

    1
    2
    3
    4
    commit


    commit work
  4. 回滚结束用户的事务,并撤销正在进行的所有未提交的修改:

    1
    2
    3
    4
    rollback


    rollback work
  5. 删除一个事务的保存点,若没有指定保存点,执行该语句操作会抛错。

    1
    release savepoint 保存点名称
  6. 将事务滚回标记点:

1
rollback to 标记点
  1. 设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
    1
    set transaction

事务处理方法

  1. 用 begin , rollback , commit 来实现事务处理。

  2. 用 set 来改变 MySQL 的自动提交模式。

set autocommit = 0 (禁止自动提交)。
set autocommit = 1 (开启自动提交)。

锁种类

  1. 锁的粒度划分: 行锁(INNODB),表锁(MyISAM),页锁
  2. 锁的使用方式划分: 共享锁 (s 锁),排它锁 (x 锁)
  3. 思想上划分: 乐观锁(假设不会发生冲突,只在提交时检查是否违反数据完整性),悲观锁(假设会发生并发冲突,屏蔽一切违反数据完整性的操作)
  4. 死锁,INNODB 中才会出现,两个或多个事务在同一资源上相互占用,并请求锁定对方的资源。

####

MyISAM 表锁

  1. 表锁的实现
  2. 锁竞争
  3. 并发插入
  4. 锁调度

InnoDB 锁

  1. 事务隔离级别
  2. 锁竞争
  3. 锁实现