注意: 使用事务, 必须选择引擎为 Innodb, myisam是没有事务的
-
MySQL 事务
-
什么是事务
- 事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行
-
事务特性
-
原子性
-
事务必须是原子工作单元,一个事务中的所有语句,应该做到:要么全做,要么一个都不
做;
-
-
一致性
- 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
-
隔离性
- 隔离性是指,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰
-
持久性:
- 一个事务执行成功,则对数据来说应该是一个明确的硬盘数据更改(而不仅仅是内存中的
变化)。
-
-
- 引擎分类
- Innodb
- 支持事务
- 默认引擎
- 支持外键
- 查询, 插入较慢
- 支持行级锁
- 不支持全文检索
- Myisam
- 不支持事务
- 非默认引擎
- 不支持外键
- 存储和查询较快
- 支持表级锁
- 支持全文检索
- Innodb
- 引擎设置修改
- 设置
- 在配置文件中加入
default-storage-engine=InnoDB
, 重启服务
- 在配置文件中加入
- 修改
- alter table table_name engine=myisam/innodb
- 设置
-
事务的使用
-
事务开启 (begin)
-
# 连接一 mysql> select * from demo; Empty set (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into demo(name) values('张三'); Query OK, 1 row affected (0.00 sec) mysql> select * from demo; +----+--------+ | id | name | +----+--------+ | 2 | 张三 | +----+--------+ 1 row in set (0.00 sec) -----------------分割线--------------------- # 连接二 mysql> select * from demo; Empty set (0.00 sec) -----------------分割线---------------------
-
-
事务提交 (commit)
-
# 连接一 mysql> commit; Query OK, 0 rows affected (0.01 sec) mysql> select * from demo; +----+--------+ | id | name | +----+--------+ | 2 | 张三 | +----+--------+ 1 row in set (0.00 sec) -----------------分割线--------------------- # 连接二 mysql> select * from demo; +----+--------+ | id | name | +----+--------+ | 2 | 张三 | +----+--------+ 1 row in set (0.00 sec)
-
-
事务回滚 (rollback)
-
# 连接一 mysql> select * from demo; +----+--------+ | id | name | +----+--------+ | 2 | 张三 | +----+--------+ 1 row in set (0.00 sec) mysql> insert into demo(name) values('lisi'); Query OK, 1 row affected (0.00 sec) mysql> select * from demo; +----+--------+ | id | name | +----+--------+ | 2 | 张三 | | 3 | lisi | +----+--------+ 2 rows in set (0.00 sec) -----------------分割线--------------------- # 连接二 mysql> select * from demo; +----+--------+ | id | name | +----+--------+ | 2 | 张三 | +----+--------+ 1 row in set (0.00 sec) -----------------分割线--------------------- # 连接一 mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from demo; +----+--------+ | id | name | +----+--------+ | 2 | 张三 | +----+--------+ 1 row in set (0.00 sec) -----------------分割线--------------------- # 连接二 mysql> select * from demo; +----+--------+ | id | name | +----+--------+ | 2 | 张三 | +----+--------+ 1 row in set (0.00 sec)
-
-
- 自动提交 (autocommit)
-
查看
autocommit
-
mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ 1 row in set (0.00 sec) # ON 代表开启 # OFF 代表关闭
-
-
开启、关闭
- 开启
- 临时生效: set autocommit=1;
- 永久生效: 在配置文件[mysqld] 下加上: autocommit=1, 重启服务
- 关闭
- 临时生效: set autocommit=0;
- 永久生效: 在配置文件[mysqld] 下加上: autocommit=0, 重启服务
- 开启
-