事务

事务是一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)。
事务有四个特性,原子性,一致性,隔离性,持久性。其中一致性是指数据库在事务开启前后都必须处于一致状态,比如两个人进行转账,转账前后的余额之和是一致的。也有人说是事务中包含的处理要满足数据库提前设置的约束,如主键约束或者NOT NULL 约束等;隔离性是指各个事务之间相互隔离不可相互影响;持久性是指一个已完成的事务对数据的改变是永远有效的。

开始事务

begin transaction开始事务

BEGIN TRANSACTION <事务名称> |@<事务变量名称>
  1. 事务变量名称是由用户定义的变量,必须由char、varchar、nchar、nvarchar数据类型来定义该变量。
  2. 使用begin transaction后@@trancount的值会加1。

提交事务

使用COMMIT提交事务操作,这意味这事务开始以来的所有数据修改都成为了永久,这也标记着一个事务的结束,将事务中所有对数据库的更新写回到磁盘上的物理数据库。
一旦执行了该命令,就不能进行回滚操作

COMMIT TRANSACTION <事务名称> |@<事务变量名称>
  1. 全局变量 @@TRANCOUNT 的值减 1

撤销事务

使用ROLLBACK撤销事务,事务运行的过程中遇到了某种障碍,不能继续运行,系统会对已有的数据库操作全部撤销,回滚到事务开始时的状态。

ROLLBACK [TRANSACTION]
[<事务名称>| @<事务变量名称> | <存储点名称>| @ <含有存储点名称的变量名>
  1. 可使用savepoint设置事务的保存点,如果事务不需要回滚撤销全部已执行的操作,就可是使用savepoint回滚到保存点。
    SAVING TRANSACTION<保存点名称>
    ROLLBACK TRANSACTION<保存点名称>
  2. 若事务回滚到起点,则全局变量@@TRANCOUNT减1;若回滚到保存点,则变量不变。

事务隔离级别

定义了4种隔离级别

  1. read uncommitted:所有事务都可以看到其他未提交事务的执行结果,也称脏读。

  2. read committed:大多数数据库的默认的隔离级别,但mysql不是此种隔离级别,提交数据后可读。

  3. repeatable read:mysql默认隔离级别,确保同一个事务的多个实例在并发读取数据时,会看到同样的数据行,但会导致幻读,InnoDB存储引擎通过多版本并发控制(MVCC)机制解决了该问题。

  4. serializable:最高的隔离级别,在每个读的数据行加上共享锁实现,可能会导致大量的超时现象和锁竞争,一般不推荐使用。

InnoDB锁机制

讲到锁前需要先介绍锁的粒度,有表锁、行锁和页锁三种粒度。
表锁的管理开销比较小,但是运行的并发量是最小的,MyISAM存储引擎使用了该锁机制,d当要写入数据时,把整个表锁住,此时其他的读写操作都会等待。

行锁支持最大的并发,InnoDB存储引擎使用了该锁机制,支持并发读写操作。

页锁开销和加索速度介于表锁和行锁间

  1. 共享锁S
    锁粒度是行,一个事务获取了共享锁后,就可以对锁定范围内数据执行操作。

  2. 排他锁X
    锁粒度是行,事务获取排他锁后,可以对锁定范围数据执行操作

  3. 意向锁ISIX
    是一种表锁,粒度是整张表,分为意向共享锁,意向排他锁两类,表示一个事务有意对数据上共享锁或排他锁。