



事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果将使数据库从一种一致性状态变迁到另一种一致性状态。事务是逻辑上的一组操作,要么全部执行,要么全部不执行。
原子性 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用。 一致性 执行事务前后,数据保持一致,多个事务对同一数据读取的结果是相同的。 隔离性 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务数据库之间是独立的。 持久性 一个事务被提交之后,它对数据库中数据的改变是持久的,即使数据库发生故障,也不应该对其有任何影响。
SQL标准定义了四个隔离级别
READ UNCOMMITTED(读取未提交)
最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、不可重复读、幻读。
READ COMMITTED(读取已提交)
允许读取并发事务已提交的数据,可以阻止脏读,但是不可重复读、幻读仍有可能发生。
REPEATABLE READ(可重复读)
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
SERIALIZABLE(串行化)
最高的隔离级别,完全服从ACID的隔离级别,所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说该级别可以防止脏读、不可重复读、幻读。
脏读
某个事务更新了一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个事务进行了ROLLBACK操作,则后一个事务读取的数据就会是不正确的。
不可重复读
在一个事务的两次查询之中数据不一致,一个未提交事务读取了另一个事务更新已提交的数据。
幻读
在一个事务的两次查询中数据的记录数不一致,例如有一个事务查询了几行数据,而另一个事务在此时插入了几行数据并进行了提交,先前的事务在接下来的查询中就会发现有几行数据是先前查询中所没有的。
读未提交
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;-- 设置当前会话数据库隔离级别为【读未提交】SELECT * FROM t_account WHERE id = 2;

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;-- 设置当前会话数据库隔离级别为【读未提交】START TRANSACTION; -- 开启事务UPDATE t_account ta SET ta.amount = "6000" WHERE id = 2; -- 修改id为2的账户余额为6000SELECT * FROM t_account WHERE id = 2; -- 当前事务为提交,在当前事务进行查询




读已提交






可重复读









可串行化


至此数据库隔离级别的基本知识就总结完毕了,想要一起交流的小伙伴可以留言哦~~


长按二维码关注我们

ITSK
博客|yajing8
我知道你在看哟

文章转载自ITSK,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





