知识点十:MySQL 事务的应用 (21-22)

  为什么要引入事务:

     为什么要引入事务这个技术呢?现在的很多软件都是多用户,多程序,多线程的。对同一表可能同时有很多人在用,为保持数据的一致性,所以提出了事务的概念。这样很抽象,举个例子:

      A给B要划钱,A的账户是-1000元,B的账户是+1000元,这两个UPDATE语句必须作为一个整体来执行,不然A扣钱了,B没有加钱这种情况很难处理。

  什么存储过程类型支持事务:

     1.查看数据库下面支持的事务(InnoDB支持):

 SHOW ENGINES;

     2.查看MySQL当前默认存储引擎:

SHOW VARIABLES LIKE ‘%storage_engine%’;

     3.查看某张表的存储引擎:

SHOW CREATE TABLE tbl_name;

     4.对于表的存储结构的修改:

建立InnoDB表: CREATE TABLE … type=InnoDB;
修改表的存储引擎:ALTER TABLE tbl_name type=InnoDB;

  如何创建事务:

 CREATE DATABASE bank;
USE bank;
CREATE TABLE account(
aid int NOT NULL,
accname VARCHAR(20) NOT NULL,
accmoney DECIMAL(20,2) NOT NULL,
PRIMARY KEY(aid)
) ENGINE=InnoDB DEFAULT CHARSET=gbk; INSERT INTO account VALUES(1,'A',4000),
(2,'B',4000);

默认数据

    创建事务的语法:

      1. 开启事务start transaction,可以简写为 begin (注意:start transaction会造成一个隐含的UNLOCK TABLES执行)
      2. 然后记录之后需要执行的一组sql
      3. 提交commit
      4. 如果所有的sql都执行成功,则提交,将sql的执行结果持久化到数据表内。
      5. 回滚rollback
      6. 如果存在失败的sql,则需要回滚,将sql的执行结果,退回到事务开始之时
      7. 无论回滚还是提交,都会关闭事务!需要再次开启,才能使用。
      8. 还有一点需要注意,就是事务只针对当前连接。

    事务的提交:

      基本原理:      

        提交,就会将结果持久化,不提交就不会。

        如果我们不开启事务,只执行一条sql,马上就会持久化数据,可以看出,普通的执行就是立即提交。
        这是因为mysql默认对sql语句的执行是自动提交的

        也就是说,开启事务,实际上就是关闭了自动提交的功能,改成了commit手动提交!

        我们可以通过简单的对是否自动提交加以设置,完成开启事务的目的!
        自动提交的特征是保存在服务的一个autocommit的变量内。可以进行修改:

SET autocommit=0;

        说明:

          可以控制的事务行为称为AUTOCOMMIT设置会话变量。
          如果AUTOCOMMIT设置为1(默认值),然后每一个SQL语句(在事务与否)被认为是一个完整的事务,并承诺在默认情况下,当它完成。
          AUTOCOMMIT设置为0时,发出SET AUTOCOMMIT =0命令,在随后的一系列语句的作用就像一个事务,直到一个明确的COMMIT语句时,没有活动的提交。

        还需要注意一点,就是事务类似于外键约束,只被innodb引擎支持。       

        补充:

commit and chain:表示提交事务之后重新开启了新的事务。
rollback and release:表示事务回滚之后断开和客户端的连接。
 --启动事务
start transaction;
--提交事务
commit; --启动两个进程查看情况
SET autocommit=0;
start transaction;
UPDATE account SET accmoney=accmoney-1000 WHERE aid=1;
UPDATE account SET accmoney=accmoney+1000 WHERE aid=2;
COMMIT; SET autocommit=1;
UPDATE account SET accmoney=accmoney-1000 WHERE aid=1;

事务的提交测试

    事务的回滚:

      回到事务发生之前的数据状态。通常rollback。

      还原测试点:

 start transaction;
UPDATE account SET accmoney=2000 WHERE aid=1;
rollback; start transaction;
UPDATE account SET accmoney=7000 WHERE aid=1;
commit and chain; --还原点测试
SET autocommit=0;
INSERT INTO account VALUES(3,'test1',5000);
savepoint s1;
INSERT INTO account VALUES(4,'test2',6000);
savepoint s2;
INSERT INTO account VALUES(5,'test3',7000);
savepoint s3;
--执行完三个插入语句,SELECT * FROM account可以看到这这三条数据,如果你想回滚到最初
--rollback就是最初什么都没有的状态。如果你想回到savepoint s1的状态(也就是插入一条test1那里)
--rollback to savepoint s1,同理什么都可以做.
rollback to savepoint s2;

事务的回滚和还原点测试  

总结事务:

  事务应该具有4个属性,原子性,一致性,隔离性,持久性。这四个属性通常称为ACID特性:

    原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么不做。

    一致性(consistency):事务必须是使数据库从一个一致性状态变成另一个一致性状态。一致性与原子性使密切相关的。

    隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

    持久性(durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

MYSQL进阶学习笔记九:MySQL事务的应用!(视频序号:进阶_21-22)的更多相关文章

  1. mysql的学习笔记(九)

    mysql不支持FULL JOIN时可用UNION ALL代替 SELECT t1.user_id,t2.user_name FROM t1 LIFT JOIN t2 ON t1.user_id = ...

  2. MYSQL初级学习笔记九:MySQL索引的使用!(视频序号:初级_51)

    知识点十一:索引的使用(51) 什么是索引: 索引的定义: 在关系型数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行的更快.索引的作用相当于图书的目录,可以 根据目录中的页码 ...

  3. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. 基于【 MySql 】二 || mysql详细学习笔记

    mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...

  6. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. Mysql数据库学习笔记之数据库索引(index)

    什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...

  8. SQLMAP学习笔记2 Mysql数据库注入

    SQLMAP学习笔记2 Mysql数据库注入 注入流程 (如果网站需要登录,就要用到cookie信息,通过F12开发者工具获取cookie信息) sqlmap -u "URL" - ...

  9. ref:学习笔记 UpdateXml() MYSQL显错注入

    ref:https://www.cnblogs.com/MiWhite/p/6228491.html 学习笔记 UpdateXml() MYSQL显错注入 在学习之前,需要先了解 UpdateXml( ...

随机推荐

  1. net8:文本文件的创建及其读写

    原文发布时间为:2008-08-06 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  2. Codeforces 667D World Tour【最短路+枚举】

    垃圾csdn,累感不爱! 题目链接: http://codeforces.com/contest/667/problem/D 题意: 在有向图中找到四个点,使得这些点之间的最短距离之和最大. 分析: ...

  3. python和python-dev

    问:python-dev是什么?为什么安装了python后有时还要安装python-dev? 答: linux发行版通常会把类库的头文件和相关的pkg-config分拆成一个单独的xxx-dev(el ...

  4. ACM用到的算法。先做个笔记,记一下

    ACM 所有算法 数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列 双端队列 可并堆 左偏堆 二叉查找树 Treap 伸展树 并查集 集合计数问题 二分图的识别 平衡二叉树 二叉排序树 线段树 ...

  5. MACBOOK 忘记密码

    如果没有系统安装盘,可以采用下面的几种方法:首先,启动机器,启动时按住Apple和S键,以单用户模式(single user mode)进入系统.输入:mount -uv / 然后回车.接下来可以采用 ...

  6. 利用广播调用后台服务方法并根据方法返回的内容更新UI

    一.UI布局代码 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

  7. 第21章、OnItemSelectedListener事件(从零开始学Android)

    在Android App应用中,OnItemSelectedListener事件也会经常用到,我们一起来了解一下. 基本知识点:OnItemSelectedListener事件 一.界面 1.新建pr ...

  8. 用Perl发送邮件小例子

    据传,Perl发送邮件有很多方案,但我只会用Mail::Sender这种方式,也就只能简单谈谈这种方式. 在参考众多网页后,程序书写如下: #!/usr/bin/perl -w use Mail::S ...

  9. android-----JNI中的log打印

    1. 导入log头文件 在你使用的 .c/ .cpp 文件中 导入 log.h 头文件 #include<android/log.h> 2.在Android.mk 中 加上 LOCAL_L ...

  10. c#中的多态 c#中的委托

    C#中的多态性          相信大家都对面向对象的三个特征封装.继承.多态很熟悉,每个人都能说上一两句,但是大多数都仅仅是知道这些是什么,不知道CLR内部是如何实现的,所以本篇文章主要说说多态性 ...