事务的四大特征和五个隔离级别

本文详细解析数据库事务的原子性、一致性、隔离性和持久性四大特性,以及五种隔离级别:default、read_uncommitted、read_committed、repeatable_read和serializable,包括它们如何防止脏读、不可重复读和幻读。

事务的四大特征

1.原子性(Atomicity):一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做要么全不做
2.一致性(Consistency):事务完成后,符合逻辑运算。数据不会因为事务的执行而遭到破坏,事务前后数据的完整性必须保持一致
3.隔离性(Isolation):一个事物的执行,不受其他事务的干扰,即并发执行的事物之间互不干扰
4.持久性(Durability):一个事物一旦提交,它对数据库的改变就是永久的

五个隔离级别

1.default:默认的事务隔离级别,跟具体的数据有关,mysql默认的事务隔离级别是repeatable_read
2.read_uncommitted: 读未提交,一个事务可以感知或者操作另外一个未提交的事务,可能会出现脏读、不可重复读、幻读
3.read_committed:读已提交,一个事务只能感知或者操作另一个已经提交的事务,可能会出现不可重复读、幻读
4.repeatable_read:可重复读,能够避免脏读,不可重复读,不能避免幻读
5.serializable:串行化,隔离级别最高,消耗资源最低,代价最高,能够防止脏读, 不可重复读,幻读。

脏读:可以读取到另一个事务尚未提交的数据

起初隔离级别为read uncommitted(读未提交):a,b两个会话,分别开启两个事务,然后a向b转了500元钱,但a未提交该事务, 此时b查看,发现多了500,然后a回滚事务,b再查看账户,发现根本就没有多500。

不可重复读:在一个事务中,两次查询的结果不一致

如果我们此时将隔离级别提升为read committed(读已提交),便可避免脏读。同样b两个会话,分别开启两个事务,然后a向b转了500元钱, 但a未提交该事务,此时b查看,依旧是原钱数。但此时,如果a提交事务,b再去查看,发现此时多了500。

可重复读

如果我们此时将隔离级别提升为repeatable read(可重复读),可以避免脏读和不可重复读的发生。同样a提交事务,b再去查看,发现依旧是原钱数,b只能结束当前事务,在开启一个新事务,才能查询到数据的变化,这便避免了不可重复读。 但是如果a事务在提交前插入了几条数据,b事务在第二次读的时候读出来多了几条,这便是幻读

串行化

如果我们设置了seriizable串行化,就相当于锁表,某一时间内只允许一个事务访问该表。

不可重复读和幻读比较

两者有些相似,但是前者针对的是update或delete,后者针对的insert。

### 事务四大隔离级别 数据库事务隔离级别用于控制多个事务并发执行时可能出现的数据不一致问题,主要包括不可重复。以下是四种主要的隔离级别及其特点: #### 1. 未提交(READ UNCOMMITTED) 这是最低的隔离级别,允许一个事务取另一个事务尚未提交的数据。在这种隔离级别下,可能会出现不可重复的问题。 ```sql SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT age FROM users WHERE name = '小明'; -- 可能取到其他事务未提交的更改[^1] ``` #### 2. 已提交(READ COMMITTED) 此隔离级别确保一个事务只能取另一个事务已经提交的数据,避免了的发生。然而,在这种隔离级别下,仍然可能出现不可重复的现象。 ```sql SET TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN TRANSACTION; SELECT age FROM users WHERE name = '小明'; -- 第一次取年龄为20岁 -- 其他事务将小明的年龄更新为30岁并提交 SELECT age FROM users WHERE name = '小明'; -- 第二次取年龄为30岁[^3] COMMIT; ``` #### 3. 可重复(REPEATABLE READ) 在该隔离级别下,事务内的多次取结果是一致的,能够避免不可重复的问题。然而,幻仍然可能发生。 ```sql SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN TRANSACTION; SELECT age FROM users WHERE name = '小明'; -- 第一次取年龄为20岁 -- 其他事务将小明的年龄更新为30岁并提交 SELECT age FROM users WHERE name = '小明'; -- 第二次取年龄仍为20岁[^2] COMMIT; ``` #### 4. 串行化(SERIALIZABLE) 这是最高的隔离级别,通过强制事务串行执行来避免所有类型的并发问题,包括不可重复。然而,这种方式会带来较大的能开销。 ```sql SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION; SELECT age FROM users WHERE name = '小明'; -- 确保数据一致 -- 其他事务无法插入或修改相关数据,直到当前事务完成 COMMIT; ``` ### 总结 不同的隔离级别适用于不同的应用场景。较低的隔离级别通常提供更高的能,但可能引入更多的数据不一致问题;而较高的隔离级别则提供了更强的一致保障,但可能降低系统的并发能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值