欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于MySQL数据库的增、删、查、改操作(四)

程序员文章站 2022-05-08 17:30:07
...

原文地址:https://www.toutiao.com/a6592057225248768525/?tt_from=mobile_qq&utm_campaign=client_share&timestamp=1535010047&app=news_article&utm_source=mobile_qq&iid=41590152322&utm_medium=toutiao_ios&group_id=6592057225248768525

8.11 事务(transaction)

关于MySQL数据库的增、删、查、改操作(四)

 

关于MySQL数据库的增、删、查、改操作(四)

是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。

- 支持连续SQL的集体成功或集体撤销。

- 事务是数据库在数据晚自习方面的一个功能。

- 需要利用 InnoDB 或 BDB 存储引擎,对自动提交的特性支持完成。

- InnoDB被称为事务安全型引擎。

-- 事务开启

START TRANSACTION; 或者 BEGIN;

开启事务后,所有被执行的SQL语句均被认作当前事务内的SQL语句。

-- 事务提交

COMMIT;

-- 事务回滚

ROLLBACK;

如果部分操作发生问题,映射到事务开启前。

-- 事务的特性

1. 原子性(Atomicity)

事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

2. 一致性(Consistency)

事务前后数据的完整性必须保持一致。

- 事务开始和结束时,外部数据一致

- 在整个事务过程中,操作是连续的

3. 隔离性(Isolation)

多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。

4. 持久性(Durability)

一个事务一旦被提交,它对数据库中的数据改变就是永久性的。

-- 事务的实现

1. 要求是事务支持的表类型

2. 执行一组相关的操作前开启事务

3. 整组操作完成后,都成功,则提交;如果存在失败,选择回滚,则会回到事务开始的备份点。

-- 事务的原理

利用InnoDB的自动提交(autocommit)特性完成。

普通的MySQL执行语句后,当前的数据提交操作均可被其他客户端可见。

而事务是暂时关闭“自动提交”机制,需要commit提交持久化数据操作。

-- 注意

1. 数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,和创建、取消或更改表或存储的子程序的语句。

2. 事务不能被嵌套

-- 保存点

SAVEPOINT 保存点名称 -- 设置一个事务保存点

ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点

RELEASE SAVEPOINT 保存点名称 -- 删除保存点

-- InnoDB自动提交特性设置

SET autocommit = 0|1; 0表示关闭自动提交,1表示开启自动提交。

- 如果关闭了,那普通操作的结果对其他客户端也不可见,需要commit提交后才能持久化数据操作。

- 也可以关闭自动提交来开启事务。但与START TRANSACTION不同的是,

SET autocommit是永久改变服务器的设置,直到下次再次修改该设置。(针对当前连接)

而START TRANSACTION记录开启前的状态,而一旦事务提交或回滚后就需要再次开启事务。(针对当前事务)

8.12 锁表

表锁定只用于防止其它客户端进行不正当地读取和写入

关于MySQL数据库的增、删、查、改操作(四)

 

8.13 触发器

触发程序是与表有关的命名数据库对象,当该表出现特定事件时,将**该对象。 监听:记录的增加、修改、删除。

关于MySQL数据库的增、删、查、改操作(四)

 

-- 创建触发器

CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt

参数:

trigger_time是触发程序的动作时间。它可以是 before 或 after,以指明触发程序是在**它的语句之前或之后触发。

trigger_event指明了**触发程序的语句的类型

INSERT:将新行插入表时**触发程序

UPDATE:更改某一行时**触发程序

DELETE:从表中删除某一行时**触发程序

tbl_name:监听的表,必须是永久性的表,不能将触发程序与TEMPORARY表或视图关联起来。

trigger_stmt:当触发程序**时执行的语句。执行多个语句,可使用BEGIN...END复合语句结构

-- 删除

DROP TRIGGER [schema_name.]trigger_name

可以使用old和new代替旧的和新的数据

更新操作,更新前是old,更新后是new.

删除操作,只有old.

增加操作,只有new.

-- 注意

1. 对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。