数据库事务(5)

本文深入探讨了数据库事务的概念,包括其四大特性——原子性、一致性、隔离性和持久性。介绍了如何开启、提交和撤销事务,以及事务处理中可能出现的脏读、不可重复读和幻读问题。此外,还详细阐述了事务的四种隔离级别及其避免的问题,帮助读者理解如何在并发环境中确保数据一致性。
摘要由CSDN通过智能技术生成

数据库事务

一、什么是事务

事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所做的所有更改都将被取消。就是说,事务具有有原子性,一个事务中的一系列的操作要么全部成功,要么全部失败。

二、事务的四大特性 (ACID)

1、原子性(Atomicity)

整的事务中的所有操作,要么全部成功,要么全部失败,不会结束在中间某个环节。事务在执行的过程中如果发生错误,会被回滚到事务开始的状态,就像这个事务从来没有执行过一样。

2、一致性(Consistency)

在事务开始之前和事务结束之后,数据库的完整性没有被破坏。

一致性属性保证了数据库从不返回一个未处理完的事务。

3、隔离性(Isolation)

数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离可以防止多个事务并发执行时由于交叉执行而导致数据的不一致

4、持久性(Durablity)

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

三、事务的处理

1、开启事务

-- 下面两种都可以
begin;
start transaction;

2、结束事务

-- COMMIT语句是提交语句,它使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,也标志一个事务的结束
COMMIT;

3、撤销事务

-- ROLLBACK语句是撤销语句,它撤销事务所做的修改,并结束当前这个事务。
rollback;
四、脏读、幻读、不可重复读

在不考虑事务的隔离控制的时候,多个事务在同一时刻对统一数据进行操作就可能影响到最终的期望结果,通常会有一下四种情况:

(1)两个更新事务同时修改一条数据,这种情况是最严重的, 程序中无论如何也不能出现这种情况,因为它会造成更新的丢失!

(2)一个更新事务更新一条数据,另一个读取事务读取了还未提交的更新,这种情况下会出现脏读

(3)A读取数据库,B又来修改了数据库并且提交了事务,A又来读取数据库,发现两次结果不一致,这就是不可重复读

(4)A读取数据库,B新添加(删除)一条数据,A又访问数据库,发现两次结果不一致,这就是幻读

五、事务的隔离级别(四种)

MySQL默认为REPEATABLE READ隔离级

  • 读未提交(read uncommitted)

    在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read);

  • 读提交(read committed)

    一个事务要等待另一个事务提交之后才能读取数据,可以避免脏读,但是不能避免不可重复读和幻读。

  • 可重复读(repeatable read)

    开始读取数据库事务时,不允许进行修改操作,可以避免不可重复读,但是不能避免幻读

  • 序列化(serializable)

    这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

总结:

隔离级别可避免不可避免
读未提交脏读、不可重复读、幻读
读提交脏读不可重复读、幻读
可重复读脏读、不可重复读幻读
串行化脏读、不可重复读、幻读
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值