MySQL事务

1、基础概念

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  • 事务用来管理 insert,update,delete 语句。

2、四大特性(ACID)

  • Atomicity 原子性
    • 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • Consistency 一致性
    • 在事务开始之前和事务结束以后,数据库的完整性没有被破坏,事务执行的前后都是合法的数据状态。数据库的完整性约束包括但不限于:实体完整性(如行的主键存在且唯一)、列完整性(如字段的类型、大小、长度要符合要求)、外键约束、用户自定义完整性(如转账前后,两个账户余额的和应该不变)。
  • Isolation 隔离性
    • 隔离性是指,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • Durability 持久性
    • 持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

3、事务并发问题

  • 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
  • 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
  • 幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

   小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

4、事务的隔离级别

  脏读 不可重复读 幻读
读未提交
读已提交
可重复读
串行化

 

  • READ UNCOMMITTED(读未提交):事务中的修改即使未提交也是对其它事务可见。
  • READ COMMITTED(读已提交):事务提交后所做的修改才会被另一个事务看见,可能产生一个事务中两次查询的结果不同。
  • REPEATABLE READ(可重复读):只有当前事务提交才能看见另一个事务的修改结果。解决一个事务中两次查询的结果不同的题。默认隔离级别是可重复度。
  • SERIALIZABLE(串行化):只有一个事务提交之后才会执行另一个事务。

MySQL事务

上一篇:IDEA连接MySQL数据库


下一篇:database/sql接口使用