乐趣区

浅谈数据库事务隔离

事务隔离次要是针对 ACID 中的 I 隔离性设置的,在理解这几种数据库事务之前须要先理解几个重要概念:

  • 脏读 – 事务 1(READ) 拜访了事务 2(WRITE)未提交的事务

  • 幻读 – 一个事务读取了 2 次,失去的后果不一样

  • 不可反复读 – 一个事务读取同一条记录 2 次,失去的后果不统一

为了解决下面的三个问题,有四种数据库隔离级别

  1. READ UNCOMMITTED

    故名思义,读未提交,容许脏读,当然也会呈现不可反复读和幻读,能够通过“排他写锁”实现,在表对某行进行批改时,会对该行加上行共享锁

  2. READ COMMITTED

    读提交,容许不可反复读取,但不容许脏读取。这能够通过“霎时共享读锁”和“排他写锁”实现。读取数据的事务容许其余事务持续拜访该行数据,然而未提交的写事务将会禁止其余事务拜访该行。在本事务未提交之前其余事务的增删改操作提交后会影响读的后果。读的是最新后果。在对表进行批改时,会对表数据行加上行共享锁

  3. Repeatable Read

    可反复读,禁止不可反复读取和脏读取,然而有时可能呈现幻读数据。这能够通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但容许读事务),写事务则禁止任何其余事务。读的是快照后果。MysQL 默认级别,通过 MVCC 解决了幻读问题。在事务中对某条记录批改,会对记录加上行共享锁,直到事务完结才会开释。

  4. Serializable

    序列化,提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无奈实现事务序列化的,必须通过其余机制保障新插入的数据不会被刚执行查问操作的事务拜访到。

    进行查问时就会对表或行加上共享锁,其余事务对该表将只能进行读操作,而不能进行写操作。

事务隔离级别越高,数据的完整性和一致性越好,但会影响并发性能。mysql 默认应用 Repeatable Read 级别,而 aliyun rds 默认应用 READ COMMITTED。

查看查询数据库隔离级别

select @@global.tx_isolation;

Mysql 8.0 以上须要应用

select @@transaction_isolation;

批改事务隔离级别:mysql.ini

# 可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
[mysqld]
transaction-isolation = REPEATABLE-READ

当然,也能够只对以后 session 批改

mysql> set session transaction isolation level read uncommited;

锁机制

共享锁:由读表操作加上的锁,加锁后其余用户只能获取该表或行的共享锁,不能获取排它锁,也就是说只能读不能写

排它锁:由写表操作加上的锁,加锁后其余用户不能获取该表或行的任何锁,典型是 mysql 事务中的

锁的范畴:

行锁: 对某行记录加上锁

表锁: 对整个表加上锁

本文由 歧途老农 创作,采纳 CC BY 4.0 CN 协定 进行许可。可自在转载、援用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末增加作者公众号二维码。

退出移动版