MySQL事务

2,101 阅读3分钟

-什么是事务?

事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。

  • 事务和锁

    当执行事务操作时(dml语句),mysql会在表上加锁,防止其他用户改表的数据。这对于用户来说是非常重要的

image.png

当我们执行操作的时候,我们可能会执行错误的命令,导致一些不可预期的问题。这时候我们会想如果能撤销错误该多好。因为这个需求,我们引出了事务这个概念。

当我们开启了一个事务,我们可以在写完一些语句后设置一个保存点,这个保存点类似于游戏存档。假使我们在这个保存点之后错误的执行了某个命令,我们可以通过回滚操作,返回到该保存点。(注意:一旦进行了回滚,那么保存点之后执行的操作都将撤销,并且无法恢复)

前提:

1.手动开启了一个事务
2.设置了相关保存点

image.png

提交事务:
使用commit语句可以提交事务,当执行了commit语句子后,会确定事务的变化,结束事务,删除保存点,释放锁,数据生效,当使用commit语句结束事务子后,其他会话【其他连接】将可以查看到事物变化后的新数据【所有的数据就正式生效】。

细节讨论

1.如果不开启事务,默认情况下,dml操作是自动提交的,不能回滚。
2.如果开启一个事务,你没有创建保存点,你可以执行rollback,默认就是回退到你事务开始的状态.
3.你也可以在这个事务中(还没提交时),创建多个保存点。比如:savepoint aaa, 执行 dml,savepoint bbb
4.你可以在事务没有提交前,选择回退到哪个保存点。
5.mysql的事务机制需要innodb的存储引擎才可以使用,myisam不可以使用 6.开启一个事务 start transaction, set autocommit=off;

事务隔离级别:

  • 读未提交(Read uncommitted)
  • 读已提交(Read committe)
  • 可重复读(Repeatable read)
  • 可串行化(Serializable)
如果不考虑隔离性,会出现如下的问题:
  • 脏读
  • 不可重复读
  • 幻读

image.png

image.png

设置隔离级别: image.png

事务的acid特性

  1. 原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
  2. 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态
  3. 隔离性(Isolation):事物的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  4. 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障有人不应该对其有任何影响。