欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

事务的四个基本特性(ACID)以及隔离级别总结

程序员文章站 2024-01-13 23:12:46
...

事务(transaction)是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作,这组操作要么一次全部成功,要么操作全部失败,事务是不可分割的一个工作单元。
本文总结了事务的四个基本特性、事务的隔离级别以及Oracle和MySQL数据库默认的隔离级别查看和设置。

事务的四个特性(ACID)

原子性(Atomicity)

事务的原子性是指事务是一个不可分割的工作单位,这组操作要么全部发生,否则全部不发生。

一致性(Consistency)

事务的一致性是指在事务开始以前,被操作的数据的完整性处于一致性的状态,事务结束后,被操作的数据的完整性也必须处于一致性状态。事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。拿银行转账来说,一致性要求事务的执行不应改变A、B两个账户的金额总和。如果没有这种一致性要求,转账过程中就会发生钱的无中生有,或者不翼而飞的现象。

隔离性(Isolation)

事务的隔离性是指一个事务的执行不能有其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。事务隔离性要求系统必须保证事务不受其他并发执行的事务的影响,也即要达到这样一种效果:对于任何一对事务T1 和 T2,在事务 T1 看来,T2 要么在 T1 开始之前已经结束,要么在 T1完成之后才开始执行。这样,每个事务都感觉不到系统中有其他事务在并发地执行。

持久性(Durability)

事务的持久性也称永久性,指一个事务一旦提交,它对数据库的改变必须是永久的,即便是数据库发生故障也应该不回对其产生任何影响。

事务的隔离级别

读未提交(Read unCommitted)

读未提交是指:一个事务可以读取到另一个事务未提交的数据,此隔离级别可导致脏读(Dirty Read)

读已提交(Read Committed)

读已提交是指:一个事务可以读取另一个事务提交的数据,但同一个事务内执行相同的select的两次查询结果可能不一致,即此隔离级别可导致不可重复读(Nonrepeatable Read)

可重复读(Repeattable Read)

可重复读是指:同一个事务内进行两次相同的select查询,另一个事务又在该期间插入了新行,两次查询结果会出现新的幻读行数据,即此隔离级别可能导致幻读(Phantom Read)

可串行化(Serializable)

可串行化是最高的隔离级别,可以避免所有的脏读、不可重读度以及幻读问题;它通过强制的事务排序,使之不可能相互冲突,从而解决幻读问题,简言之,它是在每个读的数据行上加上共享锁,在这个隔离级别上可能导致大量的超时现象和锁竞争。

事务的隔离级别在数据完全正确和高性能两着中不可兼得,隔离级别是在牺牲事务结果正确性的情况下采用不同的隔离级别来换取性能的提升,比如银行业务模块在注重性能的前提下更要保证业务数据的完全正确性。

Oracle数据库隔离级别

Oracle数据库支持Read Committed和Serializable这两种事务隔离级别,默认隔离级别为:读已提交(Read Committed)

查询Oracle数据库的隔离级别

执行一条数据更新SQL(开启事务),然后执行SQL查询会话的事务隔离级别,也即系统的事务隔离级别。

--执行一条数据更新SQL(开启事务),table_name为任一表名
select * from table_name for update;
--查询会话隔离级别
SELECT s.sid, s.serial#,
  CASE BITAND(t.flag, POWER(2, 28))
    WHEN 0 THEN 'READ COMMITTED'
    ELSE 'SERIALIZABLE'
  END AS isolation_level
FROM v$transaction t
JOIN v$session s ON t.addr = s.taddr AND s.sid = sys_context('USERENV', 'SID');

事务的四个基本特性(ACID)以及隔离级别总结

设置Oracle数据库的隔离级别

SET TRANSACTION ISOLATION LEVEL [READ COMMITTED|SERIALIZABLE];

MySQL数据库隔离级别

MySQL数据库支持四种隔离级别,默认事务的隔离级别为:可重复读(Repeattable Read)

查看MySQL数据库的隔离级别

-- 查看当前会话隔离级别
select @@tx_isolation;
-- 查看系统当前隔离级别
select @@global.tx_isolation;

事务的四个基本特性(ACID)以及隔离级别总结

设置MySQL数据库的隔离级别

-- 设置当前会话隔离级别
set session transaction isolation level repeatable read;
-- 查看系统当前隔离级别
set global transaction isolation level repeatable read;