mysql 第11天 触发器 事务的控制和锁定语句 183页

触发器

在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端
确保数据的完整性

1  创建触发器

CREATE  TRIGGER  trigger_name  trigger_time  trigger_event
              ON tbl_name FOR EACH ROW trigger_stmt

且 触发器,只能用在永久表上

其中 trigger_time 是触发器的触发时间,可以是 BEFORE 或者 AFTER,BEFORE 的含义指在检
查约束前触发,而 AFTER 是在检查约束后触发。
而 trigger_event 就是触发器的触发事件,可以是 INSERT、UPDATE 或者 DELETE。
对同一个表相同触发时间的相同触发事件,只能定义一个触发器

使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容

现在触发器还只支持行级触发的,不支持语句级触发


注意:对于有重复记录,需要进行 UPDATE 操作的 INSERT,触发器触发的
顺序是 BEFORE INSERT、BEFORE UPDATE、AFTER UPDATE;对于没有重复记录的 INSERT,就
是简单的执行 INSERT 操作,触发器触发的顺序是 BEFORE INSERT、AFTER INSERT。

对于那些实际执行 UPDATE 操作的记录,仍然会执行 BEFORE INSERT 触发器的内容,在设计触发器的
时候一定要考虑这种情况,避免错误地触发了触发器。


2  删除触发器

一次可以删除一个触发程序,如果没有指定 schema_name,默认为当前数据库

DROP TRIGGER [schema_name.]trigger_name

3  查看触发器

mysql> show triggers \G

desc triggers;

select * from triggers where trigger_name = 'ins_film_bef' \G

4 触发器的使用

 触发程序不能调用将数据返回客户端的存储程序,也不能使用采用 CALL 语句的动态 SQL
语句,但是允许存储程序通过参数将数据返回触发程序。也就是存储过程或者函数通过 OUT
或者 INOUT 类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程。
 不能在触发器中使用以显式或隐式方式开始或结束事务的语句,如 START TRANSACTION、
COMMIT 或 ROLLBACK。

MySQL 的触发器是按照 BEFORE 触发器、行操作、AFTER 触发器的顺序执行的,其中任何一
步操作发生错误都不会继续执行剩下的操作。如果是对事务表进行的操作,那么会整个作为
一个事务被回滚(Rollback),但是如果是对非事务表进行的操作,那么已经更新的记录将无
法回滚,这也是设计触发器的时候需要注意的问题。

小结

本节主要介绍了触发器的定义、修改以及触发器使用的一些注意事项。需要注意的是触发器
是行触发的,每次增加、修改或者删除记录都会触发进行处理,编写过于复杂的触发器或者
增加过多的触发器对记录的插入、更新、删除操作肯定会有比较严重的影响,因此数据库设
计的时候要有所考虑,不要将应用的处理逻辑过多的依赖于触发器来处理。


事务的控制和锁定语句

MySQL 支持对 MyISAM 和 MEMORY 存储引擎的表进行表级锁定,对 BDB 存储引擎的表进行
页级锁定,对 InnoDB 存储引擎的表进行行级锁定

默认情况下,表锁和行锁都是自动获得的,不需要额外的命令。

但是在有的情况下,用户需要明确地进行锁表或者进行事务的控制,
以便确保整个事务的完整性,这样就需要使用事务控制和锁定语句来完成

1 lock table 和 unlock table

LOCK TABLES 可以锁定用于当前线程的表。如果表被其他线程锁定,则当前线程会等待,直
到可以获取所有锁定为止。

UNLOCK TABLES 可以释放当前线程获得的任何锁定。当前线程执行另一个 LOCK TABLES 时,
或当与服务器的连接被关闭时,所有由当前线程锁定的表被隐含地解锁

LOCK TABLES
        tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
        [, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...

UNLOCK TABLES

2 事务控制

MySQL 通过 SET AUTOCOMMIT、START TRANSACTION、COMMIT 和 ROLLBACK 等语句支
持本地事务,具体语法如下

START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}

默认情况下,MySQL 是自动提交(Autocommit)的,如果需要通过明确的 Commit 和
Rollback 来提交和回滚事务,那么需要通过明确的事务控制命令来开始事务,这是和 Oracle
的事务管理明显不同的地方。如果应用是从 Oracle 数据库迁移到 MySQL 数据库,则需要确
保应用中是否对事务进行了明确的管理。
 START TRANSACTION 或 BEGIN 语句可以开始一项新的事务。
 COMMIT 和 ROLLBACK 用来提交或者回滚事务。
 CHAIN 和 RELEASE 子句分别用来定义在事务提交或者回滚之后的操作,CHAIN 会立
即启动一个新事物,并且和刚才的事务具有相同的隔离级别,RELEASE 则会断开和客户端的
连接。
 SET AUTOCOMMIT 可以修改当前连接的提交方式,如果设置了 SET AUTOCOMMIT=0,
则设置之后的所有事务都需要通过明确的命令进行提交或者回滚。


如果只是对某些语句需要进行事务控制,
则使用 START TRANSACTION 语句开始一个事务
比较方便,这样事务结束之后可以自动回到自动提交的方式,如果希望所有的事务都不是自
动提交的,那么通过修改 AUTOCOMMIT 来控制事务比较方便,这样不用在每个事务开始的
时候再执行 START TRANSACTION 语句。

事务开始后,如果不是自动提交,需要手动提交commit

当事务提交时,使用commit and chain , 则另一个会话无法获取刚刚更新或者插入的数据


3   如果在锁表期间,用 start transaction 命令开始一个新事务,会造成一个隐含的 unlock
tables 被执行

因此,在同一个事务中,最好不使用不同存储引擎的表,否则 ROLLBACK 时需要对非事
务类型的表进行特别的处理,因为 COMMIT、ROLLBACK 只能对事务类型的表进行提交和回
滚。

通常情况下,只对提交的事务记录到二进制的日志中,但是如果一个事务中包含非事务
类型的表,那么回滚操作也会被记录到二进制日志中,以确保非事务类型表的更新可以被复
制到从(Slave)数据库中。
和 Oracle 的事务管理相同,所有的 DDL 语句是不能回滚的,并且部分的 DDL 语句会造
成隐式的提交。
在事务中可以通过定义 SAVEPOINT,指定回滚事务的一个部分,但是不能指定提交事务
的一个部分。对于复杂的应用,可以定义多个不同的 SAVEPOINT,满足不同的条件时,回滚
不同的 SAVEPOINT。需要注意的是,如果定义了相同名字的 SAVEPOINT,则后面定义的
SAVEPOINT 会覆盖之前的定义。对于不再需要使用的 SAVEPOINT,可以通过 RELEASE
SAVEPOINT 命令删除 SAVEPOINT,删除后的 SAVEPOINT,不能再执行 ROLLBACK TO SAVEPOINT
命令。


4  分布式事务的使用  p183
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值