关闭

MySQL 之 触发器和事务控制

标签: mysql触发器事务控制数据库
1617人阅读 评论(0) 收藏 举报
分类:

1.触发器

触发器是与表有关的数据库对象,在满足条件时触发,并执行触发器中定义的语句集合(协助应用在数据库端确保数据的完整性)

1.1创建触发器

触发器只能创建在永久表(permanent table)上,不能对临时表(Temporary Table)创建触发器

create trigger trigger_name trigger_time trigger_event
    ON tbl_name for each row trigger_statement
//trigger_time是触发器的触发时间,可以是beforeafter
before:检查约束前触发
after:检查约束后触发
trigger_event:触发事件:可以是insert, update, delete

对同一个表相同触发时间的相同触发事件,只能定义一个触发器。
例如,对某个表的不同字段的after更新触发器,在MySQL中,只能定义成一个触发器,在触发器中通过判断更新的字段进行相对应的处理。
使用别名old和new来引用触发器中发生变化的记录内容。现在触发器只支持行级触发,不支持语句级触发。

//在样例数据库中,为film表创建了after insert 的触发器
delimiter $$
create trigger ins_film
after insert on film for each row begin
insert into film_text (film_id,title,description)
	values (new.film_id,new.title,new.description);
	end;
	$$
    delimiter ;
# 触发器
delimiter $
create TRIGGER ins_f1
AFTER #trigger time
INSERT # trigger event
ON
QY_adaboost
FOR EACH ROW BEGIN
UPDATE
QY_adaboost A
SET
A.train_f1 = 2*A.train_precision * A.train_recall / (A.train_precession + A.train_recall),
A.test_f1 = 2*A.test_precession * A.test_recall / (A.test_precession + A.test_recall);
end$

2.事务控制和锁定语句

MySQL支持对MyISAM和MEMORY存储引擎的表进行表级锁定;
BDB存储引擎的表进行页级锁定;
InoDB存储引擎的表进行行级锁定。
默认情况:表锁和行锁都是自动获得的,不需要额外的命令。
但是,有时,用户需要明确的进行锁表或者进行事务的控制,以便确保整个事务的完整性,这样就需要使用事务控制好锁定语句来完成。

2.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.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}
//start transaction或begin语句可以开始一项新的事务
//commit和rollback用来提交或者回滚事务
//chain和release子句分别用来定义在事务提交或回滚之后的操作,chain会立即启动一个新事物,并且和刚才的事务具有相同的隔离级别,release则会断开和客户端的连接。
//set autocommit可以修改当前连接的提交方式,如果设置了set autocommit=0,则设置之后的所有事务都需要通过明确的命令进行提交或者回滚。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:174960次
    • 积分:3736
    • 等级:
    • 排名:第8639名
    • 原创:180篇
    • 转载:73篇
    • 译文:12篇
    • 评论:8条
    文章分类
    最新评论