MySQL事务及触发器

目录(?)[+]

  1. 事务
    1. 提交或回滚
    2. 常见的事务指令
    3. 事务的特点ACID
  2. 触发器
    1. 创建触发器
    2. 管理触发器

事务

create table swpu(
id int primary key auto_increment,
money decimal(10,2) comment ‘学费‘
);
insert into swpu values(null,5000);
create table swpu_stu(
id int primary key auto_increment,
stu_money decimal(10,2) comment ‘学生财产‘
);
insert into swpu_stu values(null,7000);

select * from swpu;
select * from swpu_stu;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

例如,学生交杂物费100元给学校

update swpu_stu set stu_money=stu_money-100 where id=1;
update swpu set money=money+100 where id=1;
select * from swpu;
select * from swpu_stu;
  • 1
  • 2
  • 3
  • 4

事务:如果整组成功,意味着全部sql都实现。如果其中任何一个失败,意味着整个操作都失败。失败,意味着整个过程都是没有意义的。应该使数据库回到操作前的初始状态。

如何处理? 1、失败后,可以回到开始位置。 2、没都成功之前,别的用户(进程,会话)是不能看到操作内的数据修改的。

具体思路: 就是在一组操作之前,设计一个记号(备份点)。 如果执行成功,让别人看到数据的修改。 如果执行失败,别人不能看到,应该回到记号位置。

实现: 使用innodb存储引擎的事务日志功能。 如果成功,则将结果提交到数据库内。意味着就更改了数据库内容。

SQL的执行的2个阶段: 1、执行阶段 2、将执行结果,提交到数据库阶段,其中我们的事务日志就是保存执行阶段的结果。如果用于选择提交,则才将执行结果提交到数据库中。

默认的执行方式叫自动提交。执行完毕,自动完成提交工作。因此需要关闭自动提交功能。

存在一个系统的变量autocommit,可以对自动提交进行配置。

set autocommit=0;
show variables like ‘autocommit‘;
  • 1
  • 2

关闭后再次执行相应的更新语句,发现在其他的连接中查看数据时,没有发生变化,因为结果没有提交。

提交或回滚

在此基础上,执行完所有的sql语句。判断是否成功(出现错误,包括语法错误和逻辑错误,服务器错误)。 成功:将结果提交。利用commit。 失败:回到开始位置。利用rollback。

update swpu_stu set stu_money=stu_money-100 where id=1;
update swpu set money=money+100 where id=1;
select * from swpu;
select * from swpu_stu;
commit;
select * from swpu;
select * from swpu_stu;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

提交之前:

提交之后:

需要手动改为自动提交。

set autocommit=1;
  • 1

常见的事务指令

开启事务 start transcation; 关闭自动提交,如果事务结束了(成功或失败),都会回到自动提交机制,回到start时的状态。 成功:commit; 失败:rollback;

start transcation;
update swpu_stu set stu_money=stu_money-100 where id=1;
update swpu set money=money+100 where id=1;
select * from swpu;
select * from swpu_stu;
commit;
select * from swpu;
select * from swpu_stu;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

事务限定:在innodb(DBD)存储引擎下生效。

注意:要求start transcation;开启事务功能。而不用set autocommit=0;开启事务功能。

事务的特点ACID:

1、原子性 2、一致性(从开始到结束,数据不会受到事务之外其他语句的改变。) 3、隔离性(一个事务的操作不会影响另一个事务) 4、持久性(修改永久生效)

触发器

触发器:监听数据进行操作。 在当前表上,设置一个对每行数据的一个监听器,监听相关事件。 每当事件发生时,会执行一段由sql完成的一段功能代码。

触发器的元素:事件,执行代码。

创建触发器

create trigger 名字 事件 执行性代码

事件: 插入 insert 删除 delete 修改 update

时间的时机:执行之前和执行之后(after before)。 由时机和事件在一起形成了六种事件。

before insert,before delete,before update
after insert,after delete,after update
  • 1
  • 2

事件规定:在那个表上的什么时机的什么动作上。

可执行代码: SQL语句组成的代码。

create trigger name_jiaoxuefei after update  on swpu_stu
for each row
update swpu set money=money+150;

select * from swpu;
select * from swpu_stu;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

触发,触发程序:特定时间发生,即触发。

update swpu_stu set stu_money=stu_money-150 where id=1;
  • 1

注意: 触发器不能同名。 目前mysql只支持一类事件,设置一个触发器。

create trigger name_jiaoxuefei2 after update  on swpu_stu
for each row
update swpu set money=money-150;
  • 1
  • 2
  • 3

管理触发器:

删除:drop

drop trigger trigger_name;

drop trigger name_jiaoxuefei;
  • 1
  • 2
  • 3

查看:show

show create trigger trigger_name;

show create trigger name_jiaoxuefei;
  • 1
  • 2
  • 3

在触发器内,获得触发给触发程序时的数据。利用触发程序内的new和old来完成。

Old:监听事件所在表上的数据,在事件发生之前时的数据,旧的数据。

New:监听表上,事件发生之后,新处理完毕的数据。数据就是触发该事件的记录。

事件update可以使用new和old

update swpu_stu set stu_money=stu_money-150 where id=1;

//1000 950
(old.stu_money-new.stu_money)

drop trigger name_jiaoxuefei;
create trigger name_jiaoxuefei after update  on swpu_stu
for each row
update swpu set money=money+(old.stu_money-new.stu_money);

update swpu_stu set stu_money=stu_money-1500 where id=1;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

事件是insert呢?不能使用old alter table swpu add stu_count int default 0;

create trigger name_kaixue after insert on swpu_stu
for each row
update swpu set stu_count = stu_count+1;

drop trigger name_kaixue;
create trigger name_kaixue after insert on swpu_stu
for each row
update swpu set stu_count = stu_count+new.id;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

事件是delete呢?不能使用new

create trigger name_biye after insert on swpu_stu
for each row
delete swpu set stu_count = stu_count-old.id;
  • 1
  • 2
  • 3

如果一个触发程序由多条sql语句组成。应该满足如下: 1、语句组成语句块(begin end)用来标识语句块。 2、语句块的语句需要独立的语句结束符,分号。

由于触发器程序内使用分号作为语句的结束符,那么当命令行客户端碰到分号时,就应该理解成触发程序内的子语句结束,而不是整个创建触发器的语句结束。 因此,应该通过修改命令行的语句结束符达到目的。 delimiter语句可以完成设置语句结束符。

别忘了修改完之后,再改回去。

drop trigger name_kaixue;
delimiter $$
create trigger name_kaixue after insert on swpu_stu
for each row
begin
update swpu set stu_count = stu_count+1;
update swpu set money = money+100;
end
$$

delimiter ;

insert into swpu_stu values(2,2000);
select * from swpu;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

java企业级通用权限安全框架源码 SpringMVC mybatis or hibernate+ehcache shiro druid bootstrap HTML5

【java框架源码下载】

时间: 2024-10-25 08:15:24

MySQL事务及触发器的相关文章

mysql事务、触发器、视图、存储过程、函数

存储过程: procedure 概念类似于函数,就是把一段代码封装起来, 当要执行这一段代码的时候,可以通过调用该存储过程来实现. 在封装的语句体里面,可以用if/else, case,while等控制结构. 可以进行sql编程. 查看现有的存储过程: Show procedure status 删除存储过程 Drop procedure 存储过程的名字 调用存储过程 Call 存储过程名字(); 第1个存储过程 ,体会"封装sql" 第2个存储过程, 体会"参数"

mysql中的触发器和事务的操作

触发器 语法 创建触发器: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt; trigger_time是触发程序的动作时间.它可以是BEFORE或AFTER trigger_event指明了激活触发程序的语句的类型. trigger_event可以是下述值之一: ·             INSERT:将新行插入表时激活触发程序,例如,通过INSERT.LO

MySQL的学习--触发器

MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 其中: trigger_name:标识触发器名称,用户自行指定:trigger_time:标识触发时机,取值为

【MySQL笔记】触发器,存储过程和函数

一.触发器 触发器(TRIGGER):是由事件来触发某个操作.当数据库系统执行这些事件时,就会激活触发器执行相应的操作.MySQL从5.0.2版本开始支持触发器. 触发事件:INSERT语句.UPDATE语句和DELETE语句. 1.创建触发器 1.1.创建只有一个执行语句的触发器 CREATE  TRIGGER 触发器名  BEFORE | AFTER  触发事件 ON  表名 FOR  EACH  ROW  执行语句 1.2.创建有多个执行语句的触发器 DELIMITER&& CREA

MySQL 视图、触发器、函数、存储过程

1.视图 视图的概念 视图就是一条 select 语句执行后返回的结果集. 视图的特性 视图是对若干张基本表的引用,一张虚表,查询语句的执行结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变) 视图的作用 方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性:更加安全,数据库授权命令不能限定到特定的行和特定的列,但通过合理创建视图,可以把权限限定到行列级别: 应用场景 1.权限控制的时候,不希望用户访问表中某些敏感信息的列 2.对表进行复杂的关联查询时 示例: 查询小飞上的所以

数据库-mysql事务

MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行. 事务用来管理 insert,update,delete 语句 一般来说,事务是必须满足4个条件(A

MySQL 事务

MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行. 事务用来管理 insert,update,delete 语句 一般来说,事务是必须满足4个条件(A

MySQL事务详解

事务:Transaction 多个sql语句,要么同时都执行,要么同时都不执行 事务就是一组原子性的(select)查询语句,也即将多个查询当作一个独立的工作单元 ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务 A:Atomicity,原子性,都执行或者都不执行 C:Consistency,一致性,从一个一致性状态转到另外一个一致性状态 I:Isolaction,隔离性.一个事务的所有修改操作在提交前对其他事务是不可见的 D: Durability, 持久性,一旦事务得到提交,其

Mysql事务&字符集

Mysql事务 Innodb存储引擎的中的事务完全服务ACID: 原子性.2.一致性.3.隔离性.4.持久性 理解上和oracle类似. 事务隔离级别 1.Read uncommitted 读未提交: 2.Read committed 读已提交: 3.Repeatable read 可重复读,类似oracle利用undo的闪回查询: 4.Serializable 串行读,很少用. 隔离级别的修改: 通过set命令: 通过修改配置文件,启动数据库的默认隔离级别-mysqld Mysql字符集 My