简介
事务是一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务。在SQL层面可以理解为一个事务,是由多条SQL组成用以完成一个业务功能的共同体,事务影响到SQL的CRUD等操作。仅INNODB搜素引擎支持事务,在MYISAM中不支持事务,但在MYISAM中使用事务操作如BEGIN和COMMIT不会报错,使用ROLLBACK无效果(不能回滚)。如果发现在代码中使用了事务但不生效的情况,可以优先查看使用到的表是否均已经使用到了事务。MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
- 一组数据操作执行步骤,这些步骤被视为一个工作单元
-- 用于对多个语句进行分组
-- 可以在多个客户机并发访问同一个表中的数据时使用 - 所有步骤都成功或都失败
-- 如果所有步骤正常,则执行
--如果步骤出现错误或不完整,则取消
事务ACID
- Atomic(原子性)
所有语句作为一个单元全部成功执行或全部取消。 - Consistent(一致性)
如果数据库在事务开始时处于一致状态,则在执行该 事务期间将保留一致状态。 - Isolated(隔离性)
事务之间不相互影响。 - Durable(持久性)
事务成功完成后,所做的所有更改都会准确地记录在 数据库中。所做的更改不会丢失。
-
BEGIN 或 START TRANSACTION 显式地开启一个事务;
-
COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
-
ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
-
SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
-
RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
-
ROLLBACK TO identifier 把事务回滚到标记点;
-
SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
MYSQL 事务处理主要有两种方法
1、用 BEGIN, ROLLBACK, COMMIT来实现
- BEGIN 开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
- SET AUTOCOMMIT=0 禁止自动提交
- SET AUTOCOMMIT=1 开启自动提交
Autocommit模式设置
- 在MySQL5.5开始,开启事务时不再需要begin或者start transaction语句。并且,默认是开启了Autocommit模式,作为一个事务隐式提交每个语句。
- 在有些业务繁忙企业场景下,这种配置可能会对性能产生很大影响,但对于安全性上有很大提高。
- 将来,我们需要去权衡我们的业务需求去调整是否自动提交。
- 我们可以通过以下命令进行修改关闭(0是关闭,1是开启):
SET GLOBAL AUTOCOMMIT=0; --所有新建会话
SET SESSION AUTOCOMMIT=0; --当前会话
SELECT @@AUTOCOMMIT; -- 查看设置结果 - 我们也可以修改配置文件让其永久生效:
vi /application/mysql/my.cnf [mysqld] AUTOCOMMIT=0
其他触发隐式commit的情况
- 用于隐式提交的 SQL 语句:
START TRANSACTION
SET AUTOCOMMIT = 1 - 导致提交的非事务语句:
DDL语句:ALTER、CREATE 和 DROP
DCL语句:GRANT、REVOKE 和 SET PASSWORD
锁定语句:LOCK TABLES 和 UNLOCK TABLES - 导致隐式提交的语句示例:
TRUNCATE TABLE
LOAD DATA INFILE
SELECT FOR UPDATE

