数据库中的事务,事务的隔离级别

1 事务的定义

百度百科中定义:指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
简单的说,事务就是并发控制的单位,是用户定义的一个操作序列。
事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。
事务通常以begin(start) transaction 开始,以commit 或 rollback 结束。
commit 表示提交,将事务中所有对数据库的更新写会到磁盘的物理数据库中,事务正常结束。
rollback表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态。

2 事务的四个特性

而一个逻辑工作单元要成为事务,就必须满足ACID属性。

  • A:原子性(Atomicity)
    事务是数据库的逻辑工作单位,事务中的操作要么都不做,要么就全做。
  • C:一致性(Consistency)
    事务执行的结果必须是从数据库从一个一致性状态转换到另一个一致性状态。
  • I:隔离性(Isolation)
    一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰
  • D:持久性(Durability)
    一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

如果事务没有原子性的保证,那么在发生系统故障的情况下,数据库就有可能处于不一致状态。

3 事务的隔离级别

  • 读未提交(Read Uncommitted)

    (1)所有事务都可以看到其他未提交事务的执行结果
    (2)本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少
    (3)该级别引发的问题是——脏读(Dirty Read):读取到了未提交的数据。
    具体例子:廖雪峰 Read Uncommitted

  • 读已提交(Read Committed)
    (1)这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)
    (2)它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变
    (3)这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。

原因:导致这种情况的原因可能有:(1)有一个交叉的事务有新的commit,导致了数据的改变;(2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit
具体例子:https://www.liaoxuefeng.com/wiki/1177760294764384/1245266514539200

  • 可重复读(Repeatable Read)
    (1)这是MySQL的默认事务隔离级别
    (2)它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
    (3)此级别可能出现的问题——幻读(Phantom Read):当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
    (4)InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
    具体例子:https://www.liaoxuefeng.com/wiki/1177760294764384/1245268672511968
    在这里插入图片描述

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

在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:
在这里插入图片描述

解决可重复读的方法

有两个策略可以防止这个问题的发生:

(1) 推迟事务2的执行,直至事务1提交或者回退。这种策略在使用锁时应用。

(2) 而在多版本并行控制中,事务2可以被先提交。而事务1,继续执行在旧版本的数据上。当事务1终于尝试提交时,数据库会检验它的结果是否和事务1、事务2顺序执行时一样。如果是,则事务1提交成功。如果不是,事务1会被回退。
参考链接:https://www.cnblogs.com/balfish/p/8298296.html

4 发生的问题总结

  • 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

  • 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

  • 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

5 事务运行的三种模式

1.自动提交事务: 每条单独的语句都是一个事务,每个语句都隐含一个commit
2.显式事务:以begin transaction 开始,以commit 或 rollback 结束。
3.隐性事务:在前一个事务完成时,新事务隐式启动,但每个事务仍以commit或rollback显示结束

注意:隔离级别的设置只对当前链接有效。对于使用MySQL命令窗口而言,一个窗口就相当于一个链接,当前窗口设置的隔离级别只对当前窗口中的事务有效;对于JDBC操作数据库来说,一个Connection对象相当于一个链接,而对于Connection对象设置的隔离级别只对该Connection对象有效,与其他链接Connection对象无关。

参考链接:
数据库中,什么是事务?
MySQL事务隔离级别详解
通过例子理解事务的四种隔离级别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值