MySQL 事务处理

事务一般特指数据库事务(Database Transaction),是指作为一个程序执行单元执行的一系列操作,要么完全执行,要么完全不执行。

事务的特性

事务的四个特性也称为 ASCI 特性。

  1. 原子性(atomicity):一个事务是为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败。
  2. 一致性(consistent):事务将数据库从一种一致性状态转换到另外一种一致性状态,在事务开始之前和事务结束后数据库中数据的完整性没有被破坏。)
  3. 隔离性(isolation):一个事务的执行,在未提交完成前对于其它事务是不可见的。
  4. 持久性(durability ):一旦事务提交,则其所做的修改就会永久保存到数据库中。

MySQL 事务处理

基本规则

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

    • show engines; –查看服务器支持的引擎
    • 在配置文件 my.cnf 中添加 default-storage-engine = Innodb 来修改默认引擎。
  2. MySQL 默认以自动提交(autocommit)模式运行。

事务处理语句

  1. BEGINSTART TRANSACTION:显式地开启一个事务。
  2. COMMIT:提交事务,并使已对数据库进行的所有修改变为永久性的。
  3. ROLLBACK:回滚事务,并撤销正在进行的所有未提交的修改。

事务并发问题

两个事务或多个事务同时进行可能出现并发问题,典型三种问题:

  1. 脏读;比如事务 A 对数据做了修改,接着事务 B 读取了修改后的数据,但是接着 A 执行了回滚,撤销了修改。
  2. 不可重复读;比如事务 A 对某个数据进行读取,接着事务 B 对该数据做了修改并进行了提交,但是事务 A 又进行了读取,此时事务 A 读取的两次结果就不一样了。
  3. 幻读;比如事务 A 对全部数据进行相同的修改,事务 B 接着插入了一条数据并进行了提交,但是此时事物 A 查询修改的结果,发现有一条数据不是预期的结果。

可以对事物进行隔离来解决上面的问题。隔离有四个级别(由低到高、并发性由高到低):

事务隔离级别 含义 脏读 不可重复读 幻读
读未提交(read uncommitted) 两个事务之间互相可见
读已提交(read committed) 一个事务进行时,其它已提交的事物对于该事务是可见的,即可以获取其它事务提交的数据
可重复读(repeatable read) 事务进行时,其它所有事务对其不可见,即多次执行读,得到的结果是一样的
串行化(serializable) 在读取的每一行数据上都加锁,会造成大量的锁超时和锁征用,严格数据一致性且没有并发时可使用

可重复读(REPEATABLE READ)是 InnoDB 的默认隔离等级。可通过命令进行查询和修改:

  • select @@tx_isolation:查询默认隔离级别
  • set session transaction isolation level XXX:设置当前会话隔离级别
坚持原创技术分享,您的支持将鼓励我继续创作!