11

超详细的事务四大特性、隔离级别解读(带SQL语句)

 1 year ago
source link: https://www.51cto.com/article/769693.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

59e5643590e817cff76418c48a0a45626122e2.png

事务的四大特性 ACID

原子性:事务的所有操作要么全部成功,要么全部失败回滚。

一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。

隔离性:一个事务的执行不受其他事务的干扰。

持久性:一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

隔离级别产生问题

脏读:在一个事务处理过程里读取了另一个未提交的事务中的数据(未提交意味着这些数据可能会回滚,可能最终不会存到数据库)。

不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了,读取了前一个事务提交的数据。

幻读:事务在检索期间,其它事务对数据执行了操作,导致前后两次检索的数据不一样。

例如:事务1对一个表中所有数据某个字段值从“Y”修改为“N”的操作,这时事务2又对这个表中插入了一行数据,而这个数据的字段值是为“Y”。事务1如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是事务2中添加的,就好像产生幻觉一样,这就是发生了幻读。

幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

MySQL数据库的四种事务隔离级别(从低到高)

Read Uncommitted(读未提交):所有事务都可以看到其他未提交事务的执行结果。(基本上没用)。

Read Committed(读已提交):一个事务只能看见已经提交事务所做的改变。

Repeatable Read(可重读):确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。(MySQL的默认事务隔离级别)

Serializable(可串行化):通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。

隔离级别

脏读

不可重复读

幻读

读未提交

读已提交

可重读

可串行化

查看mySQL的数据库隔离级别

先看下mysql版本,执行对应sql语句。

-- 查看版本
select version();
-- 旧版本也就是5.x
select @@tx_isolation;
-- 新版本
select @@transaction_isolation;

f9517cb21d2867c6304420466d68f1e20cccf6.jpg

查询mysql版本

03a086492e4d51f20a1375bea70eb38e540889.png

查询mysql的隔离级别

-- 设置read uncommitted级别:
set session transaction isolation level read uncommitted;
-- 设置read committed级别:
set session transaction isolation level read committed;
-- 设置repeatable read级别:
set session transaction isolation level repeatable read;
-- 设置serializable级别:
set session transaction isolation level serializable;

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK