MySQL学习(四)——深入浅出谈事务

145 阅读3分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。

前言

大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习进步。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

本文主要介绍Mysql中事务的基本概念,内容略显枯燥,但同样需要我们了解。

事务

1. 事务的介绍

1.1 事务的概念

当我们需要进行多步操作时,例如张三要给李四转账1000万,那首先要从张三的余额中扣除1000万,然后讲李四的余额中加上1000万,万一在扣除了张三的钱之后,服务器挂掉了,这时候李四的余额并没有加上。我相信张三又多了一种死法。

如果我们使用了事务处理就可以避免这种悲剧的发生。

事务处理用来维护数据库的完整性,保证成批的sql语句要么全部执行,要么全部不执行,一般用来管理insert,uodate,delete语句。

1.2 事务的操作

  • 开启事务

    start transaction  或者  BEGIN 
    
  • 回滚事务

    rollback 或者 ROLLBACK WORK
    
  • 提交事务

    commit  或者 COMMIT WORK
    

【注意】在命令行模式下,mysql的事务是自动提交的(oracle是手动提交的)。可以通过使用显示命令开启事务,或者设置为禁止自动提交。

  • SET AUTOCOMMIT=0 禁止自动提交
  • SET AUTOCOMMIT=1 开启自动提交

2. 事务的四大特征

  • 原子性:一个事务的所有操作,要么全部执行,要么全部不执行,即整个事务的所有操作看作为一个执行的最小单位。
  • 一致性:事务操作前后,数据库的完整性不被破坏,即数据总量不变。
  • 隔离性:隔离性防止多个并发执行的事务由于交叉执行而造成数据不一致。
  • 持久性:事务处理结束后,无论是否成功(commit或rollback),最终的结果都会永久保存。

3. 事务的隔离级别

3.1 隔离产生的问题

  • 脏读:一个事务读取了另一个事务未提交数据。
  • 不可重复读:同一个事务前后多次读取,数据内容不一致(别的事务对数据进行了修改)。
  • 幻读:前后多次读取,数据总量不一致。(A事务读取了某一个范围内的数据,之后B事务又对这个范围内的数据进行了更改,然后A事务再次读取该范围内的数据时读取到了事务B修改后的数据,好像出现了幻觉一样。)

3.2 隔离级别

  • read uncommitted:读未提交
  • read committed:读已提交
  • repeatable read:可重复读(mysql的默认隔离级别)
  • serializable:可串行化

隔离级别从小到大,性能逐渐降低。

脏读不可重复读幻读
读未提交可能出现可能出现可能出现
读已提交不会出现可能出现可能出现
可重复读不会出现不会出现可能出现
可串行化不会出现不会出现不会出现

数据库查询隔离级别:

SELECT @@transaction_isolation;

数据库设置隔离级别:

SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL level;

名词解释:

  • global:只对执行完该语句之后产生的会话有效。
  • session:对当前会话的后续事务有效。
  • level取值:
    • READ UNCOMMITTED
    • READ COMMITTED
    • REPEATABLE READ
    • SERIALIZABLE
  • 无关键词:只对下一个即将开启的事务有效,在下一个事务结束后,恢复为默认隔离界别。

小结

以上就是关于Mysql数据库中事务的介绍,希望对读者有所帮助,如有不正之处,欢迎留言指正。