事务

1.事务处理

1.事务的概念

事务是针对数据库的一组操作, 它可以由-一条或多条SQL语句组成。

2.事务的基本操作

在默认情况下,用户执行的每一条SQL语句都会被当成单独的事务自动提交。
如果要将一组SQL 语句作为-一个事务, 则需要先执行以下语句显式地开启一个事务。

START TRANSACTION;

此时,每一条SQL语句不再自动提交,用户需要手动提交操作才会生效。

COMMIT;

如果不想提交当前事务,可以取消事务(即回滚)。

ROLLBACK;

事务的执行要么成功,要么就返回到事务开始前的状态,这就保证了同一事务操作的同步性和数据的完整性。

MySQL中的事务必须满足A、C、I、D这4个基本特性。

  • Atomicity: 原子性

一个事务必须被视为一个不可分割的最小工作单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功。

  • Consistency:一致性

一致性是指在事务处理时,无论执行成功还是失败,都要保证数据库系统处于一致的状态,保证数据库系统从不返回到一个未处理的事务中。

  • Isolation: 隔离性

隔离性是指当一个事务在执行时,不会受到其他事务的影响。保证了未完成事务的所有操作与数据库系统的隔离,直到事务完成为止,才能看到事务的执行结果。

  • Durability: 持久性

持久性是指事务一旦提交, 其对数据库的修改就是永久性的。

3.事务的保存点

在回滚事务时,若希望只撤销一部分,可以用保存点来实现。

SAVEPOINT 保存点名;

在设置保存点后,可以将事务回滚到指定保存点。

ROLLBACK TO SAVEPOINT 保存点名;

若不再需要一个保存点,使用如下语句删除。

RELEASE SAVEPOINT保存点名;

一个事务中可以创建多个保存点,在提交事务后,事务中的保存点就会被删除。
在回滚到某个保存点后,在该保存点之后创建过的保存点也会消失。

2.事务的隔离级别

事务隔离级的意义:
数据库是一个多用户的共享资源,MySQL允许多线程并发访问,用户可以通过不同的线程执行不同的事务。
为了保证这些事务之间不受影响,对事务设置隔离级是十分必要的。

1.查看事务隔离级别

#查看全局隔离级
SELECT @@global.transaction_ _isolation;
#查看当前会话中的隔离级
SELECT @@session.transaction_ isolation;
#查看下一个事务的隔离级
SELECT @@transaction_ isolation;

全局的隔离级:影响所有连接MySQL用户。
当前会话隔离级:只影响当前正在登录MySQL服务器的用户。(不会影响其他用户)
下一个事务的隔离级:仅对当前用户的下一个事务操作有影响。

MySQL中事务的隔离级别:
  • REPEATABLE READ:可重复读

MySQL的默认事务隔离级,它解决了脏读和不可重复读的问题,
确保了同一事务的多个实例在并发读取数据时,会看到同样的结果。

  • READ UNCOMMITTED:读取未提交

事务中最低的级别,可以读取到其他事务中未提交的数据。
也称为脏读(Dirty Read) :一个事务读取了另外一个事务未提交的数据。

  • READ COMMITTED:读取提交

大多数DBMS (如SQL Server、Oracle) 的默认隔离级,但不包括MySQL。
只能读取其他事务已经提交的数据,避免了脏读问题。
但是会出现不可重复读(NON-REPEATABLE READ)问题。

  • SERIALIZABLE:可串行化

隔离级的最高级别,它在每个读的数据行上加锁,使之不会发生冲突,解决了脏读、不可重复读和幻读的问题。
由于加锁可能导致超时(Timeout) 和锁竞争(Lock Contention)现象,性能是4种隔离级中最低的
除非为了数据的稳定性,需要强制减少并发的情况时,才会选择此种隔离级。

2.修改隔离级别

设置事务的隔离级别:

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL 参数值
  • SESSION: 当前会话
  • GLOBAL:全局
  • 直接省略:下一个事务的隔离级
  • TRANSACTION:事务
  • ISOLATION:隔离
  • LEVEL: 级别
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页