MySQL 事物

事务是数据库处理操作,其中执行就好像它是一个单一的一组有序的工作单元。换言之,事务将永远不会是完全的,除非在组内每个单独的操作是成功的。如果事务中的任何操作失败,整个事务将失败。

实际上,许多SQL查询组成到一个组,将执行所有这些一起作为事务的一部分。

1.概念

一条或者多条sql语句的集合!  事务:就是一堆操作的集合,他们同生共死。要么都执行成功,要么都执行失败 2.事务的特性  ACID   A:原子性  完整的,不可分割的

  原子性 (Atomicity):在事务中的操作,要么都执行,要么都不执行!

  C: 一致性  事务执行完毕后,数据的状态是一致的()

  一致性(Consistency):事务必须保证数据库从一个一致性的状态变成另一个一致性的状态!

  I: ISOLation 隔离性  两个事务执行互不影响

  隔离性(Isolation):每个事务之间互不干扰!哪怕是并发执行也不干扰!

  D: 永久性  事务执行完后,对数据的影响是永久的。

  持久性(Durability):事务一旦被改变,那么对数据库中数据的影响是永久性的!

3.事务操作的关键字   自动提交事务开关set autocommit=0   开始事务 start transaction /begin   提交事务 commit   回滚事务 rollback   set autocommit=1 4.事务+++存储过程 转账的例子

DELIMITER $$
CREATE PROCEDURE usp_transfer() 
    BEGIN  
    ##错误总数默认是0
    DECLARE t_error INTEGER DEFAULT 0;  
    ## continue 继续  hanlder 执行   并且对 t_error重新赋值为1
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;  
    SET autocommit=0;
        START TRANSACTION;  
        UPDATE bank SET balance=balance-100 WHERE cid=1;    
        UPDATE bank SET balance =balance+100 WHERE cid=2;
        IF t_error > 0 THEN  
            ROLLBACK;  
        ELSE  
            COMMIT;  
        END IF;  
     SET autocommit=1; 
    END$$  
DELIMITER ;  
 
CALL test_sp800()
 

定义一个存储过程的最简易的语法是

delimiter $$
create procedure usp_stulist()
begin
  select * from student
end$$
delimiter;

 存储过程详解将在:http://www.cnblogs.com/lsy131479/p/8463804.html   中详细介绍

          模拟 银行转账!                          

--   创建数据库

CREATE DATABASE  myBank;

--  切换指定的数据库

USE myBank;

--  创建表

CREATE  TABLE  IF NOT  EXISTS bank(
customerName  VARCHAR(10) NOT NULL  COMMENT '用户名',
currentMoney  DECIMAL(10,2) NOT NULL  COMMENT '账户余额'
);

-- 插入数据

INSERT INTO bank  VALUES('小黑',50000),('小白',500000);

--  小黑  给小白  转账10000 --   修改两条数据 --    01.小黑-10000 --    02.小白+10000

UPDATE bank SET currentMoney=currentMoney-10000
 WHERE customerName='小黑';
 --  故意写错字段名称  让02  报错
UPDATE bank SET currentMoneysss=currentMoney+10000
 WHERE customerName='小白';
 

--  开启事务   START TRANSACTION 或者 BEGIN --  01.02  为一个事务

BEGIN
 UPDATE bank SET currentMoney=currentMoney-10000
 WHERE customerName='小黑';
 UPDATE bank SET currentMoneysss=currentMoney+10000
 WHERE customerName='小白';

--  事务回滚  ROLLBACK --  提交事务 COMMIT

UPDATE bank SET currentMoney=500000  WHERE customerName='小黑'; --  证明mysql是默认提交事务的!

SET  autocommit=0(关闭事务自动提交) | 1(开启事务自动提交)

-- 关闭事务自动提交 

SET  autocommit=0;
BEGIN;   --  开启事务
 UPDATE bank SET currentMoney=currentMoney-10000
 WHERE customerName='小黑';
 UPDATE bank SET currentMoney=currentMoney+10000
 WHERE customerName='小白';
COMMIT;  --  手动提交事务
  UPDATE  bank SET currentMoney=10000;
ROLLBACK;   -- 事务回滚
SET  autocommit=1;  -- 恢复自动提交
 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spark学习技巧

小白专属mysql入门

894
来自专栏我的博客

explain

id        SELECT识别符。这是SELECT的查询序列号。 select_type 1.SIMPLE:简单的SELECT,不实用UNION或者子查询...

3269
来自专栏程序员宝库

Mysql - JOIN 详解

一个完整的SQL语句中会被拆分成多个子句,子句的执行过程中会产生虚拟表(vt),但是结果只返回最后一张虚拟表。从这个思路出发,我们试着理解一下JOIN查询的执行...

863
来自专栏程序你好

数据库MySQL中的JOIN详解

一个完整的SQL语句中会被拆分成多个子句,子句的执行过程中会产生虚拟表(vt),但是结果只返回最后一张虚拟表。从这个思路出发,我们试着理解一下JOIN查询的执行...

351
来自专栏C# 编程

3 - SQL Server 2008 之 使用SQL语句删除约束条件

基本语法为: ALTER TABLE 表名 DROP CONSTRAINT 约束名1,约束名2…… 如果删除一个约束,不需要逗号后的约束名,如果删除两个及两个以...

1880
来自专栏java达人

mysql的外键

在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据...

1747
来自专栏Java帮帮-微信公众号-技术文章全总结

【数据库】MySQL进阶八、多表查询

【数据库】MySQL进阶八、多表查询 MySQL多表查询 一 使用SELECT子句进行多表查询 SELECT 字段名 FROM 表1,表2 … WHERE ...

3954
来自专栏pangguoming

SQL语句大小写是否区分的问题,批量修改整个数据库所有表所有字段大小写

一、实例介绍 SQL语句大小写到底是否区分呢?我们先从下面的这个例子来看一下: 例: --> 创建表,插入数据: declare @maco table (nu...

3467
来自专栏编程心路

写给新手的Mysql入门指南(二)

ALTER TABLE t1 ALTER age SET DEFAULT 20;

542
来自专栏乐沙弥的世界

SQL 基础-->创建和管理表

(列名 数据类型 [ default 默认值] [ 约束条件] [ , ......] )

331

扫描关注云+社区