一, 事务
什么是事务
通常, 在此之前, 我们说, 一条语句使用一个分号 (;) 来结束, 并得到执行.
那么我们说, 这个 "一次性执行" 的过程, 可以称为 "一个事务".
简单来说,"一条 sql 语句, 就是一个事务".
则:
数据库 (自然包括 MySQL 数据库) 中的事务, 是指, 可以将 "多条语句" 的执行, 当作 "一条语句" 来看到的一种内部机制.
即:"事务" 是一种可以保证 "多条语句一次性执行完成" 或 "一条都不执行" 的机制.
事务的特点
原子性: 一个事务中的所有语句, 应该做到: 要么全做, 要么一个都不做;
一致性: 让数据保持逻辑上的 "合理性", 比如: 一个商品出库时, 既要让商品库中的该商品数量减 1, 又要让对应用户的购物车中的该商品加 1;
隔离性: 如果多个事务同时并发执行, 但每个事务就像各自独立执行一样
持久性: 一个事务执行成功, 则对数据来说应该是一个明确的硬盘数据更改(而不仅仅是内存中的变化).
事务的基本实现流程
1, 声明事务开始: start transaction
2, 设定多条要执行的具体语句, 比如: insert,update,delete, select... 其实就是执行, 只是这些执行的语句, 并不 "生效"-- 其只是内存状态下的执行, 而不是物理状态的执行.
3, 判断是否需要执行该些语句:
- if( 判断是否有错误){
- // 执行 -- 才针对执行了物理性改变 -- 即生效.
- commit;
- }
- eslse{
- // 回滚 -- 不执行任何语句.
- rollback;
- }
判断是否有错误通常分这两种环境:
(1), 如果是 cmd 中, 直接观察是否出错.
(2), 如果是 PHP 程序中, 那就需要使用 mysql_error()函数来判断是否有错.
例子: 下面来使用事务完整转账这件事情(假设为 cmd 模式):
- start transaction;
- # 第一步:
update cunkuan set 存款 = 存款 - 4000 where id=2;
- # 第一步做完, 突然断电了?
- # 第二步:
update cunkuan set 存款 = 存款 + 4000 where id=1;
则如果这两条语句都没有错误, 就可以:
commit;
但, 如果其中发生了错误, 则可以:
rollback;
二, 触发器
什么是触发器
是 MySQL 中的一种 "一触即发" 的机器(机制).
其实只是预先定义好的一段代码. 该段代码无需人工调用, 而是会在'预计'好的某个情形下自动执行.
触发器:
不能返回数据;
也不能有 select 语句;
也没有参数, 也不能调用, 而是在触发的情况下自动调用(执行).
形式:
create trigger 触发器名字 before(或 after)insert(或 update 或 delete)on 表名 for each row
begin
要执行的代码, 语句块, 编程环境, 但这里也不能使用 select 语句.
end;
在触发器内部, 其中有两个关键字具有特定含义和数据获取作用:
new: 代表新插入的一条数据, 在 insert 事件的时候有效.
old: 代表旧的一条数据, 在 update 或 delete 的时候有效.
来源: http://www.bubuko.com/infodetail-2909554.html