MySQL基础知识整理 ---- 事务

    技术2022-07-11  101

    事务概述

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

    2.事务应用的举例 模拟银行的转账操作:假设初始账户余额为1000元,均大于500,这时张三给李四转账500元。其应该分为以下几个步骤 (1)查看张三用户余额是否大于500元(这里可省略)。 (2)张三账户减500元。 (3)李四账户加500元。

    如果当我们转账过程中遇到如下问题:张三转账完毕后,出现了异常,李四账户操作无法执行。这样便会导致数据的错误。 那我们又该如何解决上诉问题呢? 需要将上面三个步骤当做一个整体,要么同时执行成功,要么同时执行失败,这就是我们所说的事务。

    3.开启事务,回滚事务,提交事务 如何将以上的操作步骤变为一个整体,这便要使用建立事务的sql语句。

    start transaction 开启事务 rollback 回滚事务 commit 提交事务

    /* 建立一张账户表,存储张三和李四账户的余额 */ create table account( id int primary key auto_increment, name varchar(10), money int -- 账户余额 ); /* 将转账操作用事务管理 */ start transaction; -- 开启事务 update account set money = money-500 where name = '张三'; -- 张三账户减500元 update account set monry = money+500 where name = '李四'; -- 李四账户加500元 rollback; -- 如果发生错误回滚事务 commit; -- 如果执行正确就提交事务

    需要注意的是,当我开启一个事务后,只有将其提交,数据才会持久性改变,否则只是临时修改。其次在MySQL当中执行增加,删除,改变语句均被当做一个事务,且MySQL事务提交的方式,默认为自动提交。

    /* 查看和修改MySQL数据库提交的语法 */ select @@autocommit; -- 查看事务的提交方式,1代表自动提交,0代表手动提交 set @@autocommit = 0; -- 设置事务的提交方式位手动提交

    事务的四大特征

    1.原子性:事务是不可分割的,要么同时执行成功,要么同时执行失败。 2.持久性:如果事务一旦被提交或回滚后,数据库会持久化的保存数据。 3.隔离性:多个事务之间相互独立,事务与事务之间隔离。 4.一致性:几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。

    事务的隔离级别

    1.为什么要有事务隔离级别?如果多个事务 操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。 下面两张表分别展示了问题和隔离级别的类型。

    问题类型描述脏读一个事务读取到另一个事务没有提交的数据不可重复读(虚读)事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。主要针对update和delete幻读事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。主要针对insert 隔离级别该级别可能产生的问题read uncommitted(读未提交)脏读,不可重复读,幻读read committed(读已提交)不可重复读,幻读repeatable read(可重复读)幻读serializable(串行化)可以解决所有问题

    需要注意的是以上所描述的隔离级别,从上到下安全性越来越高,但是效率却越来越低。其次,在MySQL数据库当中,其默认的隔离级别为 repeatable read(可重复读)。

    /* 查询和修改隔离级别的sql语法 */ select @@tx_isolation; - 查询隔离级别 set global transaction isolation level serializable; -- 设置隔离级别为串行化

    以上即是mysql当中关于事务部分的知识点的简单整理。

    Processed: 0.010, SQL: 9