MySql事务

目录

1.事务

1.1概念

1.2特征

1.3隔离级别

1.3.1内容

1.3.2查看

1.3.3修改

1.4操作

1.4.1开始事务

1.4.2执行语句

1.4.3提交事务

1.4.4回滚事务

1.5三种错误

1.5.1脏读

1.5.2不可重复读

1.5.3幻读

1.事务

1.1概念

事务简而言之是SQL语句的组合,为实现某种复合型功能。其中将有序的SQL语句作为一个逻辑单元执行,如果其中任何一个语句失败,则整个事务将被回滚到起始状态,以确保数据的一致性。

1.2特征

如果仅是简单的SQL语句有序组合,那么事务概念还不足够清晰。因此事务的概念还需满足四种特征,即原子性(Atomicity),一致性(Consistency),隔离性(Isolation,又称独立性),以及持久性(Durability),简称ACID。

  • 原子性(Atomicity):事务是一个原子操作单元,要么全部执行成功,要么全部回滚,不存在部分执行的情况。如果事务中的任何一个操作失败,整个事务会被回滚,数据会恢复到事务开始前的状态,不会对数据库产生影响。
  • 一致性(Consistency):事务执行前后,数据库的状态应保持一致。这意味着在事务开始之前和结束之后,数据库必须处于一个合法的状态,所有的约束和规则都得到满足。
  • 隔离性(Isolation):多个事务可以并发地执行,但是每个事务的操作对其他事务是隔离的,即一个事务的中间状态对其他事务是不可见的。这样可以防止并发执行时出现脏读、不可重复读和幻读等问题。
  • 持久性(Durability):一旦事务提交成功,对数据库的修改将永久保存,即使数据库发生故障或重新启动,修改的数据也不会丢失。

1.3隔离级别

1.3.1内容

MySQL支持多种事务隔离级别,用于控制多个事务之间的可见性和影响范围。事务隔离级别决定了一个事务中的修改对其他事务的可见性,以及其他事务对该事务的修改的可见性。

共计四种事务隔离级别,分别是:

  • 读未提交(Read Uncommitted):是最低的隔离级别,其事务当中的修改对其他事务可见(其他事务可以读取到未提交的数据),可能导致脏读,不可重复读,以及幻读问题。
  • 读提交(Read Committed):是默认隔离级别,其事务中的修改在提交后才对其他事务可见(其他事务无法读取到未提交的数据),可能导致不可重复读和幻读问题。
  • 可重复读(Repeatable Read):可以保证在同一事务内多次读取同一数据时,结果保持一致(加锁)。并且事务在执行期间,其他事务不能对该事务读取的数据加以修改。可能导致幻读问题。
  • 串行化(Serializable):是最高的隔离界别,其事务加锁串行执行,彼此不会相互干扰。可以避免脏读、不可重复读和幻读问题,但可能导致并发性能下降。

1.3.2查看

具体的,我们可以使用如下SQL语句来查看当前的隔离级别。

select @@tx_isolation;

执行上述语句,我们便可以在终端上看到:

MySql事务_第1张图片

说明当前的隔离等级是可重复度级别。

1.3.3修改

我们也可以使用如下语句来对当前的隔离级别作以修改。

set global transaction isolation level READ UNCOMMITTED;

上述语句的意思是将当前的隔离级别修改为读未提交级别,具体的执行结果如下:

MySql事务_第2张图片

给出全部的隔离等级修改语句:

set global transaction isolation level READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE;

1.4操作

1.4.1开始事务

事务开始的操作语句有以下两种:

start transaction;

或是:

begin;

1.4.2执行语句

开始事务之后,我们便可以添加SQL语句进入,来当作本次事务的内容来进行完成。可以是表的创建,删除和更新等操作。

1.4.3提交事务

提交事务的语句如下:

commit;

当执行结束数据库的操作语句,且保证其执行成功之后,我们便可以使用commit语句来将事务的操作永久的保存到数据库当中。

1.4.4回滚事务

回滚事务的语句如下:

rollback;

如果执行数据库的操作语句过程中,出现错误或结果与预期不符时,我们可以使用rollback语句来将事务的操作撤销,将数据库恢复到事务开始前的状态。

MySQL当中还为我们提供了添加回滚节点的语句,即创建保存点,允许在事务中部分回滚。这在处理复杂的事务操作时非常有用。具体的创建语句如下:

savepoint savepoint_name;

后续savepoint_name为自定义的节点名称,便于后续回滚时,判断具体回滚到那一节点。

例如此时需要回滚到savepoint_name节点,我们需要进行执行的MySQL语句便是:

rollback to savepoint_name;

最后,需要注意的内容是,一旦事务执行过程中出现异常,为维护事务的原子性,系统会自动的回滚,来保证数据库中数据的完整性。

并且,上述回滚也不是万能的,一旦事务被提交,则意味着对数据库内容的修改已经完成,是不可逆的。所以,事务提交意味着回滚也无法再执行。

1.5三种错误

在上述的隔离级别当中,我们提到了脏读、不可重复读和幻读三种问题,在此我们对其内容进行介绍。

1.5.1脏读

脏读(Dirty Read):是指一个事务在读取另一个事务未提交的数据时,从未提交的数据中读取到了不一致的内容。此时,当被读取数据的事务发生回滚时,读取数据事务获得的内容可能是错误的或不存在的。

脏读主要发生在隔离等级为“读未提交”当中。

1.5.2不可重复读

不可重复读(Non-repeatable Read):是指一个事务内多次读取同一数据,在此期间另一个事务修改了该数据,导致两次读取的数据不一致。此时,会破坏数据的一致性,使得同一个事务当中多次读取到的数据结果不一致。

不可重复读主要发生在隔离级别为“读提交”和“可重复读”当中。

1.5.3幻读

幻读(Phantom Read):是指一个事务在读取一组数据时,另一个事务插入了符合该条件的新数据,导致第二次读取时结果不一致。此时,容易导致事务在读取期间新增或删除数据,使得查询结果不一致。

幻读主要发生在隔离级别为“可重复读”和“串行化”当中。

你可能感兴趣的:(MySql基础,mysql,数据库)