数据库:mysql基础(五)--事务

  • 事务

    • 首先先介绍一下存储引擎

      • 什么是存储引擎呢?
      • 存储引擎(show ENGINES;)
        • 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。Mysql的核心就是存储引擎。

        • 存储引擎规范了数据底层的组织方式,锁水平,索引策略。使用不同的存储引擎,还可以获得特定的功能。

        • mysql支持插件式存储引擎,默认使用Innodb(mysql5.5之后)。

      • 常见存储引擎

        • Innodb:事务性数据库首选存储引擎。安全性能高,支持行锁定,支持外键。

        • myisam:不支持事务,但是查询效率较高

        • memory:数据存储于内存,查询效率高

        • 数据库:mysql基础(五)--事务_第1张图片

      • 如何查看和设置存储引擎

        • show engines; 查看当前存储引擎

        • 设置存储引擎:还记得我们安装数据库需要大家记住一个数据的存储位置么?ProgramData这个隐藏文件夹的位置,在里面的mysql Server x.x(我的是MySQL Server 5.7)中的my.ini配置文件中修改:default-storage-engine=INNODB

        • 一样的修改编码格式也可以在这个配置文件中进行配置

          • 1.关闭mysql服务: net stop mysql

          • 2.进入编辑 my.ini配置文件:

            • 客户端:default-character-set=utf8

            • 服务端:character-set-server=utf8  和 collation-server=utf8_general_ci

          • 3.启动mysql服务: net start mysql

          • 就可以将编码格式修改到utf-8了

    • 事务

      • 什么是事务?

        • 事务用于保证数据的一致性,由一组DML操作组成,该组SQL语句要么同时成功,要么同时失败。例如转账。
        • #我们模拟一下转账的曹邹,zs取100给ls存上..假设我们有一张account表来记录人员和金钱数目
          update account set money = money - 100 where name = 'zs';
          delete from aa;
          update account set money = money + 100 where name = 'ls';
          
          #第一个执行完毕,执行第二句,由于没有aa这个表会出现异常,第三句就不执行了.所以"钱没了"..这就引出了我们所说的事务

           

      • 开启和提交事务

        • 开启事务:start transaction; 执行完这一句,会进入到一个事务的环境下.begin;
        • 提交事务: commit;
        • 回滚事务: rollback; --如果事务失败了,将状态恢复到事务开启之前
        • 注意:只要是dml操作,必须在事务环境中..以前咱们写了很多的增删改操作其实都是系统自动帮我们执行的开启事务提交事务的操作.
        • 我们可以执行:show variables like '%autocommit%';这个语句看一下返回结果,下图
        • 数据库:mysql基础(五)--事务_第2张图片
        • 上图显示,系统是默认开启自动提交的.虽然之前我们没有主动开启和主动提交事务,但是mysql是默认自动开启事务和提交事务的.默认将任何一个dml操作当做一个事务处理了
        • 如果我们不想自动提交,怎么办?
          • 设置关闭自动提交:set autocommit = 0 ;就可以了
          • 那我们执行执行dml语句如何得到结果呢? 手动提交 输入 commit;就可以了.注意:只有当提交操作执行了之后,数据才能存储进去.
        • 下面我们模拟一个转账的事务的完整流程
        • #设置关闭自动提交
          set autocommit = 0;
          
          #开启事务
          start transaction;
          
          #转账业务
          update account set money = money - 100 where name = 'zs';
          SAVEPOINT a;//设置保存点
          update account set money = money + 100 where name = 'ls';
          rollback to a;//回滚到保存点状态
          
          #提交或回滚
          commit;        #提交事务,提交事务所有的保存点全部失效
          roolback;      #回滚事务
          #我们还是要设置回来自动提交的
          set autocommit = 1;

          一般我们是在使用事务的时候才会关系自动提交.使用事务结束后,再次开启

      •  事务的ACID特性--四大特性

        • 原子性A(Atomicity): 事务内的dml操作必须作为整体成功或者失败。
        • 一致性C(Consistency): 事务执行前后整体状态不变。
        • 隔离性I(Isolation): 并发事务之间不能产生干扰。
        • 持久性D(Durability): 事务提交后将持久化到数据库。
      • 并发事务产生的问题(对隔离性的补充)

        • 脏读: 一个事务读到另一个事务未提交的数据。
        • 不可重复读: 一个事务在可读范围内,多次读取发现数据不一致。原因:另一事务在此过程中修改该数据并且提交事务。
        • 幻读(虚读):事务可读范围内,多次读取发现数据新增或者减少问题。 原因:另一事务在此过程中添加或者删除记录并提交事务。
      • 事务的隔离级别

        • 读未提交: 不能解决任何问题。  ---基本没有人设置成
        • 读已提交: 解决脏读问题       ---oracle使用
        • 可重复读: 解决脏读和不可重复读问题。--mysql使用
        • 串行化: 解决所有问题。--但是没有并发,效率低,经常使用第二、三个
        • 查看和修改事务隔离级别
          • 查看:SELECT @@tx_isolation;
          • 修改: set session transaction isolation level;   目前已经是比较好的方式了,尽量不要去修改.

 

你可能感兴趣的:(MySQL)