什么是数据库事务?

数据库-事务的理解

  1. 事务的基本介绍

    1. 概念:

      • 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败
    2. 操作:

      1. 开启事务: start transaction;
      2. 回滚: rollback;
      3. 提交: commit;
    3. 事务提交的两种方式:

      1. 自动提交(执行mysql的一条DML语句就会自动提交一个事务)
      2. 手动提交(需要先开启事务,然后再提交)
    4. 修改事务的默认提交方式:

      SELECT @@autocommit; --1代表自动提交  0代表手动提交
      SET @@autocommit = 0; --修改默认的提交方式 
      
    5. 个人理解(我就举一个生活当中的小例子):

      ​ 相信我们大家都有过网购的经历吧。现在我们假设一个场景,假设你在淘宝上挑中了一件衣服,然后你点击购买( start transaction),再输入完密码付完钱之后,商家接受到了订单准备发货。(这时,就开启了一个事务)晚上,你女朋友不经意的透露着她想要一瓶SK-II,而且过几天就是她的生日了,你想买一瓶送给你的女朋友做生日礼物。然后你默默的打开自己的手机,看了看余额发现钱不够。这时,你突然想到如果把上午在淘宝上买的那件衣服退掉的话,那么钱就刚刚好够买一瓶了。于是你去淘宝上点击退款(rollback),由于你平常的信用非常好,所以淘宝立马把钱退给你了,同时取消了订单。(这其实就是事务的回滚,就是当我们执行sql语句时出现异常了,那么就会返回到我们最近一次开启事务的地方)好,你现在有了足够的钱去买一瓶SK-II了,于是你打开了天猫,找到了SK-II官方旗舰店,选中了你女朋友喜欢的那款,然后点击购买。过了几天,在你收到商家的快递之后,你点击确认收货(commit),你购买时付的钱就从阿里爸爸的账户里打到商家的账户上。(一个事务结束了)(ps:这只是我的理解,淘宝背后具体的流程我也不知道,这只是我凭着感觉猜的,可能我举的这个例子不是很合理)

  2. 事务的四大特征

    1. 原子性:是不可分割的最小操作单位,一个事务当中的所有操作要么同时成功,要么同时失败。(同生共死的关系)不允许事务部分完成,可以避免一些错误。
    2. 持久性:当事务提交或者回滚后,数据库会持久化的保存数据。所谓持久化,意思就是会保存在我们的硬盘当中。
    3. 隔离性:多个事务之间。相互独立,互不影响。
    4. 一致性:事务操作前后,数据总量不变。 (这就有点像我们物理里面的能量守恒定律)
  3. 事务的隔离级别

    1. 不同的事务之间是隔离的,相互独立的。但是如果多个事务操作同一批数据,则会导致一些严重的问题,我们可以通过设置不同的隔离级别来解决这些问题。(ps:这就有点像我们不同班级的学生在不同的教室上着课一样,假设我们班在上音乐课,隔壁班在上数学课,我们和隔壁班之间隔着一堵墙,但假设墙的材质不是很好,隔壁班可以清清楚楚的听见我们在上音乐课,我们班也能清楚的听到隔壁班老师在讲什么数学题目,这时就会引发一些问题,我们班还好,影响不是很大,但是隔壁班就…这边上着数学课,看着一大堆看不懂的公式,还挺不清楚老师在讲啥,耳边全是那“动听”的音乐,这后果可想而知。)

    2. 存在的问题:

      1. 脏读:一个事务,读取到另一个事务中没有提交的数据(ps:其实就有点像被污染的意思,举一个不恰当的例子,假设你家的厕所和你家的厨房只隔了一块布,你妈妈在炒菜的时候,你由于肚子疼,在上厕所,你在厕所里用力一闻,emm…,真想,你妈妈在外面炒菜,然后想闻一下菜香不香,结果…,咦~,真臭,这就出大问题了,然后,然后你就(手动狗头))
      2. 不可重复读:在同一个事务中,两次读取到的数据不一样。
      3. 幻读:一个事务查询数据表中的数据,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。(就像出现了幻觉一样)
    3. 隔离级别:

      1. read uncommitted :只读但是未提交

        会产生脏读、不可重复读、幻读的问题。

      2. read commited:读取了同时也提交了

        会产生不可重复读、幻读的问题。

      3. repeatable read:可重复读(mysql默认)

        会产生幻读的问题。

      4. serializable:串行化

        基本上可以解决所有的问题

      5. 这里我们需要注意的是隔离级别从小到大安全性越来越高,但同时执行效率会越来越低(ps:这里的从小到大指得是从read uncommitted 到 serializable)(那么执行效率为什么会越来越低呢?我现在也不是很清楚,我猜可能是从read uncommitted 到serializable 底层需要执行的操作变多了)

你可能感兴趣的:(sql,数据库,sql,mysql)