数据库中事务的四大特性(ACID)及事务的隔离级别

数据库 小智 601℃ 0评论

在讲数据库 事务的隔离级别 前,我们首先要明白事务的特性。

事务的四个特性

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

原子性(Atomicity)

原子性是指,一个事务是一个不可分割的工作单位,事务中的所有操作,要么全部成功,要么全部失败回滚。
举例:
拿转账来说,用户A给用户B转账,至少要包含两个操作,用户A钱数减少,用户B钱数增加,增加和减少的操作要么全部成功,要么全部失败,是一个原子操作。

一致性(Consistency)

一致性是指,一个事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
举例:
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来还得是5000,这就是事务的一致性。

隔离性(Isolation)

隔离性是指,一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据,对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
就是要达到这样一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

持久性(Durability)

持久性是指,一个事务一旦被提交,它对数据库中数据的改变就是永久性的。接下来的其他操作或故障不应该对其有任何影响。

数据库的隔离级别

数据库中的读现象浅析(脏读、不可重复读、幻读)这篇文章中,我们介绍了数据库系统中读数据时可能会出现的问题,数据库系统提供了隔离级别的功能,现在我们介绍下数据库的几种隔离级别。

数据库的事务隔离级别(TRANSACTION ISOLATION LEVEL)是一个数据库系统中很基本的一个概念。在这个系统中为了保证数据的一致性和完整性,我们引入了事务隔离级别这个概念,当然,对一个单用户、单线程的应用来说则不存在这个问题。

隔离的目的(为什么要有事务隔离级别)
多个线程同时操作数据库的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性。

现在来看看MySQL数据库为我们提供的四种隔离级别:

- Read uncommitted (未提交读):最低级别,任何情况都无法保证(脏读、不可重复读、幻读)。
- Read committed (已提交读):可避免脏读的发生。
- Repeatable read (可重复读):可避免脏读、不可重复读的发生。
- Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。
像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。

在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读)
而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (已提交读)这两种级别,其中默认的为Read committed级别

查看MySQL数据库的隔离级别:

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

设置MySQL数据库的隔离级别:
方法一
语法:set [global|session] transaction isolation level 隔离级别名称;
说明:参数为global时对全局有效,需退出后重新进入才能查询到变化,为session时可立即查询到变化。
示例:

set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;

方法二(只对当前session有效):
语法:set tx_isolation=’隔离级别名称’;
示例:

set tx_isolation='READ-UNCOMMITTED';
set tx_isolation='READ-COMMITTED';
set tx_isolation='REPEATABLE-READ';
set tx_isolation='SERIALIZABLE';

PS:隔离级别的设置只对当前链接有效。对于使用MySQL命令窗口而言,一个窗口就相当于一个链接,当前窗口设置的隔离级别只对当前窗口中的事务有效(set global transaction isolation level 隔离级别名称,会对全局有效);对于JDBC操作数据库来说,一个Connection对象相当于一个链接,而对于Connection对象设置的隔离级别只对该Connection对象有效,与其他链接Connection对象无关。

本文固定链接:心知博客 » 数据库中事务的四大特性(ACID)及事务的隔离级别
本站内容除特别标注外均为原创,欢迎转载,但请保留出处!

喜欢 (1)
发表我的评论
取消评论
表情

请填写您的昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址