MySQL基础教程之事务异常情况

作者:木木止月 时间:2024-01-15 06:12:20 

测试异常情况

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
出错了....
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';
  • 我们把数据都恢复到2000, 然后再次一次性执行上述的SQL语句(出错了.... 这句话不符合SQL语 法,执行就会报错),检查最终的数据情况, 发现数据在操作前后不一致了。

MySQL基础教程之事务异常情况

控制事务一

查看/设置事务提交方式

SELECT @@autocommit ;
SET @@autocommit = 0 ;

提交事务

COMMIT;

回滚事务

ROLLBACK;

注意:

上述的这种方式,我们是修改了事务的自动提交行为, 把默认的自动提交修改为了手动提 交, 此时我们执行的DML语句都不会提交, 需要手动的执行commit进行提交。

控制事务二

开启事务

START TRANSACTION 或 BEGIN ;

提交事务

COMMIT;

回滚事务

ROLLBACK;

转账案例:

-- 开启事务
start transaction
-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';
-- 如果正常执行完毕, 则提交事务
commit;
-- 如果执行过程中报错, 则回滚事务
-- rollback;

事务四大特性

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。

  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。上述就是事务的四大特性,简称ACID。

补充:Mysql 事务并发处理的三种异常

脏读(Dirty Read)【一个事务可能读取到另一个事务更新但未提交的数据,这个数据有可能是脏数据】

不可重复读(Nnrepeatable Read)【事务不可重复读同一条记录,因为很可能读到的结果不一致】

幻读(Phantom Read)【幻读就是没有读到的记录,以为不存在,但其实是可以更新成功的,并且,更新成功后,再次读取,就出现了。】

A1访问数据库,正在进行事务,往表B里加入一条记录,但是还未提交该事务,此时A2也去访问数据库了,这个时候,A2可以看到A1加入的数据,这种现象就是脏读。

A2访问数据库查看id=1的数据,这个时候A1访问数据库,开始了一个事务,更新了id=1的数据,且没有提交。然后A2又去访问数据库查看id=1的数据,看到的数据跟第一次看到的数据不一样,而是A1更新的数据,这种现象就是不可重复读。

A2访问数据库,查看B表里的全部数据。这个时候A1又往B表里加一条记录,开始了事务但是还未提交。这个时候A2又去查看了一下,就出现了A1加进去的但还未提交的数据,这种现象就是幻读。

来源:https://juejin.cn/post/7159396636790095886

标签:mysql,事务,异常
0
投稿

猜你喜欢

  • 特殊字符、常规符号及其代码对照表

    2010-08-24 18:13:00
  • [翻译]标记语言和样式手册 Chapter 15 为body指定样式

    2008-02-21 12:36:00
  • CI框架教程之优化验证码机制详解【验证码辅助函数】

    2024-05-13 09:56:34
  • Tensorflow的常用矩阵生成方式

    2023-03-27 16:03:55
  • 使用 JSON 进行数据传输

    2008-06-15 07:12:00
  • Python 判断是否为质数或素数的实例

    2023-06-18 15:35:35
  • golang中使用sync.Map的方法

    2024-02-08 13:50:40
  • PHP PDOStatement::getAttribute讲解

    2023-06-05 07:29:31
  • python使用json序列化datetime类型实例解析

    2021-03-03 05:33:40
  • JavaScript中的Math.atan2()方法使用详解

    2024-05-03 15:57:13
  • JS中怎样判断undefined(比较不错的方法)

    2024-04-19 09:54:20
  • mybatis连接MySQL8出现的问题解决方法

    2024-01-22 08:27:59
  • 吐血推荐珍藏的Visual Studio Code插件(推荐)

    2023-02-09 08:58:31
  • Python动态配置管理Dynaconf的实现示例详解

    2021-01-24 19:35:06
  • 利用Python查看目录中的文件示例详解

    2023-02-06 14:13:28
  • python画微信表情符的实例代码

    2022-01-09 07:06:40
  • Ubuntu安装Mysql启用远程连接的详细图文教程

    2024-01-25 16:57:31
  • Python反向传播实现线性回归步骤详细讲解

    2021-06-04 10:20:03
  • Vue路由应用详细讲解

    2024-05-05 09:24:03
  • 开源MySQL公司停止提供企业版源代码tar包

    2009-01-14 13:02:00
  • asp之家 网络编程 m.aspxhome.com