一、什么是事务?

    事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

  计算机中的事务

      概念:例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

      特性

        事务是恢复和并发控制的基本单位。
        事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
        原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
        一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
        隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
        持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

  事务控制语句:

      BEGIN 或 START TRANSACTION 显式地开启一个事务;

      COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;

      ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

      SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;

      RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

      ROLLBACK TO identifier 把事务回滚到标记点;

       SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

  MYSQL 事务处理主要有两种方法:

      1、用 BEGIN, ROLLBACK, COMMIT来实现 BEGIN 开始一个事务 ROLLBACK 事务回滚 COMMIT 事务确认

         2、直接用 SET 来改变 MySQL 的自动提交模式: SET AUTOCOMMIT=0 禁止自动提交 SET AUTOCOMMIT=1 开启自动提交

  提交事务

 1 CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb;  # 创建数据表
2
3 select * from runoob_transaction_test;
4
5 begin; # 开始事务
6
7 insert into runoob_transaction_test value(5);
8
9 insert into runoob_transaction_test value(6);
10
11 commit; # 提交事务
12
13 select * from runoob_transaction_test;

  回滚事务

begin;    # 开始事务

insert into runoob_transaction_test values(7);

rollback;   # 回滚

select * from runoob_transaction_test;   # 因为回滚所以数据没有插入

二、什么是存储过程?

    MySQL 5.0 版本开始支持存储过程。

    存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。

    存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

     存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。

  优点:

      存储过程可封装,并隐藏复杂的商业逻辑。

      存储过程可以回传值,并可以接受参数。

      存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看 表,数据表或用户定义函数不同。

        存储过程可以用在数据检验,强制实行商业逻辑等。

 创建一个简单的存储过程:

    


DELIMITER $$   #后面有提到

1 create procedure testa() #procedure 关键字
2 begin 

3 select * from users;
4 select * from orders;

5 end$
DELIMITER $;

  

call testa(); #查看存储过程

    

  存储过程的变量:

    

 1 delimiter $$  #后面有讲
2 create procedure test2()
3 begin
4 -- 使用 declare语句声明一个变量
5 declare username varchar(32) default '';
6 -- 使用set语句给变量赋值
7 set username='xiaoxiao';
8 -- 将users表中id=1的名称赋值给username
9 select name into username from users where id=1;
10 -- 返回变量
11 select username;
12 end$
13 delimiter $;

  存储过程参数:

1 delimiter $$
2 create procedure test4(userId int)
3 begin
4 declare username varchar(32) default '';
5 declare ordercount int default 0;
6 select name into username from users where id=userId;
7 select username;
8 end$
9 delimiter $;

  存储过程条件语句:

delimiter $$
create procedure test7(in userId int)
begin
declare username varchar(32) default '';
if(userId%2=0)
then
select name into username from users where id=userId;
select username;
else
select userId;
end if;
end$
delimiter $;

  存储过程循环语句:

delimiter $$
create procedure test9()
begin
declare i int default 0;
while(i<10) do
begin
select i;
set i=i+1;
insert into test1(id) values(i);
end;
end while;
end$ delimiter $;

  自定义函数:

1 delimiter $$
2 create function getusername(userid int) returns varchar(32)
3 reads sql data -- 从数据库中读取数据,但不修改数据
4 begin
5 declare username varchar(32) default '';
6 select name into username from users where id=userid;
7 return username;
8 end$
9 delimiter $;

三、什么是触发器?

    触发器(数据库原理术语):触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。

    触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
    触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。
    此外触发器是逻辑电路的基本单元电路,具有记忆功能,可用于二进制数据储存,记忆信息等。
 
     

    触发器的优缺点

        优点:触发器可通过数据库中的相关表实现级联更改。从约束的角度而言,触发器可以定义比CHECK更为复杂的约束。与CHECK约束不同的是,触发器可以引用其他表中的列。例如,触发器可以使用另一个表中的数据来比较更新数据,以及执行其他操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表的状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、DELETE或UPDATE)允许采取多个不同的对策以响应同一个修改语句。

        缺点:滥用会造成数据库及应用程序的维护困难。在数据库操作中,可以通过关系、触发器、存储过程、应用程序等来实现数据操作。同时,规则、约束、缺省值也是保证数据完整性的重要保障。如果对触发器过度地依赖,那么将会影响数据库的结构,同时增加了维护的复杂性。

    触发器的作用:

      触发器经常用于加强数据的完整性约束和业务规则等。 触发器创建语法四要素:

        1.监视地点(table)

        2.监视事件(insert/update/delete)

          3.触发时间(after/before)

          4.触发事件(insert/update/delete)

     

   SQL语法

      DELIMITER $$

         CREATE TRIGGER `<databaseName>`.`<triggerName>`
         < [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
         ON [dbo]<tableName>  #dbo代表该表的所有者
         FOR EACH ROW  #这句话在mysql是固定的  
         BEGIN
           sql语句;
         END $
         DELIMITER $; 
         //脚本中有多行,以分号结尾。MySQL默认的行分隔符是 分号,遇到分号,就执行前面一段语句。 脚本中有多行,我们希望不按照分号来一句一句执行,希望一段代码作为一个整体执行。 在脚本最前面加上 delimiter $$ 并且在end后改回分号  delimiter $; 
    
  假设存在一张学生表(student),包括学生的基本信息,学号(stuid)为主键。
 

 另外存在一张成绩表(cj),对应每个学生包括一个值。其中number表示序号为主键,自动递增序列。它在插入过程中默认自增。同时假设成绩表中包括学生姓名和学号。
 

该成绩表目前没有值,先需要设计一个触发器,当增加新的学生时,需要在成绩表中插入对应的学生信息,至于具体math、chinese、english后面由老师打分更新即可

  那么,如何设计触发器呢?

    1.首先它是一个插入Insert触发器,是建立在表student上的;

    2.然后是after,插入后的事件;

    3.事件内容是插入成绩表,主需要插入学生的学号和姓名,number为自增,而成绩目前不需要。

      注意:new表示student中新插入的值。

1 DELIMITER $$
2 create trigger ins_stu
3 after insert on student for each row
4 begin
5 insert into cj ( stu_id, stu_name)
6 values( new.stuid, new.username);
7 end$
8 DELIMITER $;
    
 
  然后插入数据: insert student values ('eastmount','111111','6','1991-12-05');        同时插入两个数据,触发器正确执行了;

 

  查看触发器

      在MySQL5.7以前,对同一个表相同触发时机的相同触发事件,只能定义一个触发器。例如,对于某个表的不同字段的AFTER更新触发器,只能定义成一个触发器,在触发器中通过判断更新的字段进行相应的处理。所以在创建触发器之前,最好能够查看MySQL中是否已经存在该触发器。

      MySQL中,查看触发器有两种方法,一种是使用SHOW TRIGGERS语句,一种是SHOW CREATE TRIGGERS TRIGGERNAME 查看触发器的详细信息。

 
 
 
 

Mysql_事务_存储过程_触发器的更多相关文章

  1. mysql 视图,事务,存储过程,触发器

    一 视图 视图是一个虚拟表(非真实存在),是跑到内存中的表,真实表是硬盘上的表.使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sq ...

  2. 走向面试之数据库基础:三、SQL进阶之变量、事务、存储过程与触发器

    一.变量那点事儿 1.1 局部变量 (1)声明局部变量 DECLARE @变量名 数据类型 ) DECLARE @id int (2)为变量赋值 SET @变量名 =值 --set用于普通的赋值 SE ...

  3. 转:SQL进阶之变量、事务、存储过程与触发器

    一.变量那点事儿 1.1 局部变量 (1)声明局部变量 DECLARE @变量名 数据类型 DECLARE @name varchar(20) DECLARE @id int (2)为变量赋值 SET ...

  4. Oracle_视图_索引_plsql_游标_存储过程_存储函数_触发器

    -- 感觉有用点个赞呗^v^ select * from emp; drop view persin_vw;--删除视图 create table emp as select * from scott ...

  5. 11-SQLServer的事务、存储过程和触发器

    一. 事务 在SQLServer中,每条SQL语句,默认就是一条隐式的事务,但是如果我们需要一组SQL语句,那么就需要采用SQLServer提供的特有的标记 来声明事务的开始.提交和回滚了. 事务的开 ...

  6. mysql学习之路_事物_存储过程_备份

    数据备份与还原 备份:将当前已有的数据保留. 还原:将已经保留的数据恢复到对应表中 为什么要做数据备份 1,防止数据丢失,被盗,误操作 2,保护数据记录 数据备份还原方式有多种:数据表备份 单表数据备 ...

  7. MySQL视图、触发器、事务、存储过程、内置函数、流程控制、索引

    一.视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...

  8. MSSQL 事务,视图,索引,存储过程,触发器

    事务 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行. 在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的.这特别适用于多用户同时操作的数据 ...

  9. MySQL存储过程_创建-调用

    阅读目录:MySQL存储过程_创建-调用-参数 存储过程:SQL中的"脚本" 创建存储过程 调用存储过程 存储过程体 语句块标签 存储过程的参数 in:向过程里传参 out:过程向 ...

随机推荐

  1. 6月15日 python学习总结 Django模板语言相关内容

    Django模板语言相关内容   Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...

  2. 搭建域环境,安装Exchange Server 2013,复现CVE-2019-1040

    搭建域环境 操作系统: 域控:Windows server 2008 R2    域成员: Windows Server 2012 . Windows 7 对于将要安装成为DC的服务器来讲,其系统配置 ...

  3. K-good number Theory + 数学问题

    这道题是我做CodeTon Round1时的D题,总的来看思路很重要,有几个比较明显的切入问题的角度,要选择到最优的那个: 先看题目: 我们可以发现,这道题的描述一目了然,就是说我们能不能找k个数的和 ...

  4. BUAA_C++算法板子积累_动态规划、图算法、计算几何、FFT

    Hello #include <iostream> #include <cstdio> #include <cctype> #include <cmath&g ...

  5. CF1430F Realistic Gameplay (贪心+DP)

    朴素做法暴力DP,O(nk)过不去... 1 #include <cmath> 2 #include <cstdio> 3 #include <cstring> 4 ...

  6. java反射笔记(学习尚硅谷java基础教程)

    反射一.概述:Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性 ...

  7. 《前端运维》五、k8s--3灰度发布、滚动更新与探针

    一.灰度发布 灰度发布是一种发布方式,也叫金丝雀发布,起源是矿工在下井之前会先放一只金丝雀到井里,如果金丝雀不叫了,就代表瓦斯浓度高.原因是金丝雀对瓦斯气体很敏感.灰度发布的做法是:会在现存旧应用的基 ...

  8. linux管理用户(组)与相关问题处理

    相关联文件如下: /etc/passwd/etc/shadow/etc/group ================================= [切换当前用户为root]sudo -i [创建 ...

  9. python django对数据表的增删改查操作

    新增操作:方式1:book = BookInfo(title='西游记',price=99)book.save() 方式2:BookInfo.objects.create(title='西游记',pr ...

  10. Http请求的Get和Post的区别?

    1. get从地址栏以明文的方式提交请求信息内容?username=admin&password=123,用户可见, 而post从请求正文提交请求信息内容,用户不可见. 2. get提交因为是 ...