数据库事务&隔离级别

今天药忘吃喽~ 2022-05-13 01:52 299阅读 0赞

1.事务:作为一个单元的一组有序的数据库操作。

#

2.数据库事务(进行事务操作)的四大特征:

<1>原子性:事务包含的操作不可分割,要么全部执行,要么全部回滚,不存在某一小部分执行成功的情况;

例如:ATM机取款的一个事务操作,你需要 插卡—输入密码—取款金额1000—吐出现金1000—卡内余额会减少1000;取款成功需要每一步全部执行完成,否则全部回滚 事务操作失败。

<2>一致性事务执行之前和执行之后必须处于一致性状态,事务执行使得数据库从一种正确的状态转换到另一种正确的状态;因此数据库指挥保存成功提交的事务,如果数据库故障导致部分数据存储不成功 就会使数据库处于一种不一致的状态(不正确);

例如:A、B两人共有1000元,两人相互转账, 不管他们怎么转 转了多少次,到最后他们的金额合计还是1000元。

<3>隔离性事务的执行不受其他并发事务的影响。一个事务内部操作及使用的数据对其他并发事务都是隔离的,并发执行的事务之间都是互不干扰的(事务未正确提交前,不允许把该事务对数据的任何改变提供给任何其他事务);

例如:两个 事务A上车、事务B下车 可以并发执行,两个乘客可以同时在这一站上车和下车,而不是说 一个乘客在这一站下车的话 另一个乘客就不能上车了,这两个并发事务上车和下车之间是互不干扰的;

<4>持久性:**事务提交后 结果永久性的保存到数据库,不会无缘无故的回滚;**

3.不考虑事务的隔离性

由隔离性我们可以看到多线程并发操作时,如果不考虑事务的隔离性 可能引发一下问题:

  • 脏读:一个事务的处理过程读取了另一个还没有提交的事务;
  • 不可重复读:一个事务范围内多次查询得到了不同的结果,因为查询间隔导致被另一个事务修改并提交 更新update 操作;
  • 虚读(幻读):“当事务A要对数据表中某个字段的所有值进修改操作,此时有一个事务是插入一条记录 并提交给数据库,当提交事务A 的用户再次查看时就会发现有一行数据未被修改,其实是事务B刚刚添加进去的” 这就是幻读 插入insert操作

4.数据库事务隔离级别

针对于以上的情况 MySql提出了四种隔离级别:

  • Serializable (串行):采用锁表机制,隔离界别最高,效率最低;可避免脏读、不可重复读、幻读的发生。
  • Repeatable read (可重复读):MySQL的默认级别;可避免脏读、不可重复读的发生。
  •    Read committed (读已提交):可避免脏读的发生。
  •    Read uncommitted (读未提交):最低级别,任何情况都无法保证。

    <1> 这四种从1—4级别由高到低,最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低;

    <2>Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,默认为Read committed级别 ;

    <3>查看MySQL隔离级别:select @@tx_isolation;

    <4>设置MySQL隔离级别:set @@tx_isolation;

    <5>查看MySQL隔离级级别一定要在开启事务之前;

发表评论

表情:
评论列表 (有 0 条评论,299人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据库事务隔离级别

    数据库事务:所谓事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全部不做,是一个不可分割的工作单位。      对数据库的操作全都是以事务的方式进行! 事务的开始