15-MySQL事务

78 阅读2分钟

事务是一个操作序列, 序列中的多个操作要么都做要么都不做。 最常见的例子, A给B转100块钱, A账户-100, B账户+100, 这两个操作要么都执行, 要么都不执行。 如果A-100, B没有变化, 这是不允许的, 所以需要事务的处理。

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

  • 原子性: 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  • 一致性: 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

  • 隔离性: 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • 持久性: 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

    ------以上引用自菜鸟教程

 begin; -- 开始事务
 ​
 update account set balance = balance - 50 where uname = '小明';
 update account set balance = balance + 50 where uname = '小红';
 ​
 rollback; -- 回滚
 commit; -- 提交, 持久化

查询事务隔离级别

 -- 查询事务隔离级别
 select @@TRANSACTION_isolation;

设置当前会话隔离级别

 -- (设置当前会话的隔离级别) 设置事务的隔离级别
 set session transaction isolation level read uncommitted;
 set session transaction isolation level read committed;
 set session transaction isolation level repeatable read;
 set session transaction isolation level serializable;