数据库事务机制总结

209 阅读3分钟

前言

事务机制有很多博客文档解读,很多讲解让人误解,抽空总结一下,实操一把,记录一下详细过程。

锁操作

查看事务隔离级别(全局和会话):select @@global.tx_isolation,@@tx_isolation;

设置事务隔离级别:

set global transaction isolation level read committed; //全局的

set session transaction isolation level read committed; //当前会话

查看锁整体状态: show status like '%lock%';

查看引擎状态(可以查看到最后一次死锁信息):show engine innodb status\G;

查询是否锁表:show open tables where in_use>0;

查询正在使用的事务:select * from information_schema.innodb_trx\G;

查看正在锁的事务(只有单个事务,但没有竞争的时候查看不到相关信息):select * from information_schema.innodb_locks;

查看正在等待锁的事务:select * from information_schema.innodb_lock_waits;

锁类型

1)按照锁机制分类

  • 排他锁 (X锁)
  • 共享锁 (S锁)

2)按照锁数据粒度分类

  • 行级锁
  • 表级锁
  • 页级锁

行级锁:开销大,加锁慢;会出现死锁;锁粒度最小,发生锁冲突的概率最低,并发度也最高。

表级锁:开销小,加锁快;不会出现死锁;锁粒度大,发生锁冲突的概率最高,并发度低。

页级锁:MySQL特有,开销和加锁时间在表锁和行锁之间;会出现死锁;锁粒度界表锁和行锁之间,并发度一般。

数据库事务机制

事务,保证一组操作要么全部执行,要么全部不执行,保证数据库一致性。简称ACID。
  • A 事务原子性(Atomicity)

    事务中一组操作要么全部执行,要么全部不执行

  • C 事务一致性

    事务的允许不改变数据的一致性

  • I 事务隔离性

    两个事物执行时隔离的,不会交错执行

  • D 事务持久性

    事务执行成功后,该事务对数据库所做的更改持久的保存在数据库中。

事务引发的并发调度问题

  • 脏读

    A事务读取B事务未提交的数据

  • 不可重复读

    事务中两次读取数据不一样(包括新增、更新、删除)

  • 幻读

    在同一事务里,多次查询的结果和事务开始第一次查询的状态一致。但是,如果另外一个事务同时提交了新数据,虽然本事务再次按照相同的条件查询得到相同的结果集,但是本事务指定更新时,就会发现这些新数据,这些数据就像“鬼影”一样出现。

事务隔离级别

  • Read uncommitted 读未提交

所有事务都可以看到其他未提交事务的执行结果。存在脏读问题。

  • Read committed 读提交

    一个事务只能看见已经提交事务的内容。解决了脏读,存在不可重复读问题。

  • Repeatable read 可重复读

    同一个事务多次读取时,获取到的内容一致。解决了不可重复读问题,存在幻读。

  • 可串行化 强制事务排序,试之不能相互冲突,解决了幻读问题

MySQL中四中隔离级别,分别可能产生的问题:

隔离级别	脏读	不可重复读	 幻读
读未提交	√	    √	         √
读已提交	×	    √	         √
可重复读	×	    ×	         √
可串行化	×	    ×	         ×