mysql事务的ACID特性和隔离级别

一、mysql事务的ACID特性


ACID是指事务的四个特性,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。其中,隔离性是数据库在多个并发事务同时执行时保证数据正确性的一个重要特性。

在并发事务中,可能会出现脏读(dirty read)、不可重复读(non-repeatable read)和幻读(phantom read)等问题,而隔离级别就是用来解决这些问题的。

MySQL标准定义了四种隔离级别,包括读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable)。隔离级别越高,事务之间的隔离性就越好,但是会带来额外的开销和性能损失。因此,在实际应用过程中需要根据具体需求和性能要求进行选择。

二、mysql隔离级别说明


1、读未提交(read uncommitted)


读未提交隔离级别指的是一个事务修改了数据,但是还没有提交,另外一个事务可以看到这个未提交的数据,可能会出现脏读问题。

2、读提交(read committed)


读提交隔离级别指的是一个事务提交了数据后,其他事务才能看到这个数据。在读提交隔离级别下每个SQL语句执行时都会创建一个新的视图。这意味着在同一事务中,每个SQL语句都可以看到其他事务已经提交的更改。这种隔离级别可以防止脏读,但无法防止不可重复读和幻读等问题。

3、可重复读(repeatable read)


可重复读隔离级别指的是在一个事务执行期间,多次读取同一条数据得到的结果是一致的,避免了不可重复读问题。在“可重复读”隔离级别下,当事务启动时创建一个视图,并且在整个事务期间都会使用这个视图。这意味着在事务开始后,如果其他事务更改了底层表的数据,则对该事务来说,它看不到这些更改。只有在事务提交后才能看到被修改的结果。这种隔离级别可以防止脏读、不可重复读和幻读等问题。

4、串行化(serializable)


串行化隔离级别则是最高的隔离级别,它保证在并发事务执行时,每个事务都像是在单独执行,避免了所有并发问题,但是会带来显著的性能损失。在“串行化”隔离级别下,通过锁定来避免并行访问。这意味着只有一个事务可以同时访问某些数据。在这种隔离级别下,所有读取和写入操作都会被串行化。虽然可以避免以上所有问题,但是这种隔离级别的性能非常低下。


因此,在实际选择隔离级别时需要综合考虑数据正确性和性能要求,选择一个适当的隔离级别。MySQL默认的隔离级别是可重复读(repeatable read)。

三、MySQL查询当前的隔离级别

我们可以使用以下命令查询当前的隔离级别:
select @@global.transaction_isolation ;         #查看全局的隔离级别
SELECT @@transaction_isolation ;                #查看会话的隔离级别
show variables like 'transaction_isolation' ;   #查看会话的隔离级别

四、设置隔离级别

以下是设置MySQL事务隔离级别的方法:(SESSION为当前会话,global为全局)

1、通过在MySQL命令行中运行SET语句设置隔离级别。

例如,要将隔离级别设置为“读已提交”,可以运行以下命令:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;


2、在连接到MySQL服务器时,可以使用--transaction-isolation选项指定默认隔离级别。

例如,要将默认隔离级别设置为“可重复读”,可以运行以下命令:
mysql --transaction-isolation=REPEATABLE-READ -u username -p dbname


3、在MySQL配置文件中设置隔离级别。

打开MySQL配置文件my.cnf(或my.ini),找到[mysqld]部分,并将以下行添加到该部分中:
transaction-isolation = READ-COMMITTED


4、在应用程序中设置隔离级别。

这需要使用适当的MySQL客户端库和API。例如,在PHP中,可以使用以下代码设置隔离级别:
mysqli_query($conn, "SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED");

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