前言
事务这个东西基本都了解 但是很多人不能将整个逻辑串联起来 可能大部分人就知道ACID 但是事务的知识远远不止ACID 怎么能抗住追问 和 完善自己的知识目录 这个还是不错的 建议认真看完
SQL 标准事务隔离级别
SQL 标准中规定了 4 种事务隔离级别,在多事务并发时可以避免一些事务并发问题。
read uncommitted
read uncommitted(读未提交):简称 RU 级别,这个隔离级别是不允许脏写发生的,也就是说不允许两个事务在没提交的情况下去更新同一行数据,却允许读取未提交的数据。但是依旧可能发生脏读、不可重复读、幻读等问题。所以一般情况下都不会使用这个级别。
read committed
read committed(读已提交):简称 RC 级别,这个隔离级别是不允许脏写和脏读的,也就是说不允许读取和修改事务未提交的值。但是依旧可能发生不可重复读和幻读等问题,因为在事务期间内别的事务修改数据并提交后,还是会被这个事务读取到。
repeatable read
repeatable read(可重复读):简称 RR 级别,这个隔离级别是不允许脏写、脏读和不可重复读发生的,也就是说不会在事务内读到被其它事务修改的值,哪怕别的事务已提交。但是依旧有可能发生幻读问题,因为它不保证别的事务新增或删除数据后,这个事务不被影响。
serializable
serializable(串行化):简称 S 级别,这个隔离级别可以避免所有多事务问题,因为这个隔离级别下,所有的事务都将串行化,不会并发执行事务。但是这将会严重降低数据库的性能,所以这个级别一般也不会用。
综上,一般用的最多的就是 RC、RR 级别。并且在 MySQL 中 RR 级别已经可以避免幻读的问题了,所以 MySQL 默认的隔离级别就是 RR 级别。
修改事务隔离级别
MySQL 中默认的 RR 级别,可以避免多事务的问题,所以一般不用修改,但在某些业务场景下也许需要修改隔离级别。
MySQL 命令行
使用命令:SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL {level 级别};
leve 级别:READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE
Spring 事务注解
也可以使用 Spring 的注解 @Transactional 来修改事务级别, @Transactional 注解有一个参数 isolation 可以直接设置隔离级别,默认为 @Transactional(isolation=Isolation.DEFAULT),也就是说默认为 MySQL 设置的级别。