其乐融融的IT技术小站

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

事务的四大特性 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;

查询mysql版本

查询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;
赞 ()
分享到:更多 ()

相关推荐

内容页底部广告位3
留言与评论(共有 0 条评论)
   
验证码: