事务的四个特性以及隔离级别简介

本文详细阐述了事务的四个关键特性:原子性确保操作要么全成要么全败,一致性保证数据一致性,隔离性防止并发干扰,而持久性确保提交后数据持久。介绍了不同隔离级别的概念及其在数据库中的应用,如MySQL的设置和常见级别。

事务的四个特性

事务具有4个特征,分别是原子性、一致性、隔离性和持久性,简称事务的ACID特性。

原子性(atomicity)

原子性是指一个事务中的所有操作要么全部执行成功,要么全部执行失败回滚,不能只执行其中的一部分操作。换句话说,事务是一个不可分割的工作单位,要么全部完成,要么全部不完成

一致性(consistency)

一致性要求事务的执行不能破坏数据库数据的完整性和一致性。在事务执行之前和之后,数据库必须保持一致性状态。一致性包括数据库的内部一致性和外部一致性。内部一致性是指事务内部的操作必须完全执行,外部一致性是指数据库在不同的时间点都必须处于一致的状态。

  • 内部的一致性
    在同一个事务内部的一组操作必须全部成功(或者全部失败) 这就是事务原子性

  • 外部一致性

    • 由外部的应用编码来实现,即银行的应用在进行转账的操作时,必须在同一事务内部调用对账户A和账户B的操作,以保证账户A中扣除的金额必须与账户B中存入的金额相等。
    • 应用开发人员则需要保证数据库有适当的约束(主键,引用完整性等),并且工作单元中所实现的业务逻辑不会导致数据的不一致(即,数据预期所表达的现实业务情况不相一致)。
    • 如果数据库系统在运行过程中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所作的修改有一部分已写入物理数据库,这是数据库就处于一种不正确的状态,也就是不一致的状态。如果在这个阶段出现错误,这不是数据库本身能解决的,也不属于我们要讨论的范围。

持久性(durability)

持久性是指一旦事务提交,其对数据库中数据的修改将永久保存在数据库中,即使发生系统崩溃或机器宕机等故障,数据库系统也能够保证将数据恢复到事务提交后的状态。持久性保证了数据的持久存储,是数据库系统的一个重要特性。

隔离性(isolation)

隔离性是指多个事务并发执行时,一个事务的执行不能被其他事务所干扰,每个事务的操作及使用的数据对其他并发事务是隔离的。隔离性主要解决并发事务间的相互影响问题,确保事务在并发执行时不会出现数据不一致的情况。

隔离级别

在数据库中,事务的隔离级别是指多个事务同时运行时,一个事务对数据库中的数据所做的修改对其他事务的可见性程度。隔离级别通常是由数据库管理系统来提供和实现的。常见的隔离级别包括:

  1. 读未提交(Read Uncommitted):一个事务对数据的修改即使没有提交,其他事务也可以读取到该修改的数据。这是最低的隔离级别,会导致脏读(Dirty Read)问题。

  2. 读提交(Read Committed):一个事务对数据的修改只有在提交之后,其他事务才能读取到该修改的数据。这样可以避免脏读,但可能会导致不可重复读(Non-repeatable Read)问题。

  3. 可重复读(Repeatable Read):一个事务在运行期间多次读取同一数据,得到的结果是一致的,即使其他事务对该数据做了修改也不会影响。这样可以避免不可重复读,但可能会导致幻读(Phantom Read)问题。

  4. 可串行化(Serializable):最高的隔离级别,确保每个事务的执行结果与串行执行的结果相同。所有的事务都好像在串行执行一样,没有并发。这样可以避免脏读、不可重复读和幻读,但性能会受到影响。

在 Django 中,你可以通过设置 transaction.isolation_level 来指定事务的隔离级别。例如:

from django.db import transaction

# 设置事务的隔离级别为可重复读
transaction.set_isolation_level('REPEATABLE READ')

Mysql中查看隔离级别

# 查看系统隔离级别:
select @@global.tx_isolation;
# 查看会话隔离级别(5.0以上版本):
select @@tx_isolation;
# 查看会话隔离级别(8.0以上版本):
select @@transaction_isolation;

Mysql修改隔离级别

#  设置会话隔离级别为可重复读
set session transaction isolation level repeatable read;
# 设置会话隔离级别为读未提交
set session transaction isolation level read uncommitted; 
# 设置会话隔离级别为读已提交
set session transaction isolation level read committed; 

注意

  • 并非所有的数据库都支持所有的隔离级别,具体的支持情况需要查看对应数据库的文档。
  • MySQL InnoDB 存储引擎的 默认支持的隔离级别是 可重复读 级别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值