事务处理是一种机制,用来管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果。利用事务处理,可以保证一组操作不会中途停止,它们或者作为整体执行,或者完全不执行(除非明确指示)。如果没有错误发生,整组语句提交给(写到)数据库表。如果发生错误,则进行回退(撤销)以恢复数据库到某个已知且安全的状态。 (简单讲就是一批sql要不都成功,要么都不成功,we are a team!!!)
有两个目的:
并非所有的引擎都支持事务。MyISAM
和InnoDB
是两种最常使用的引擎。 只有InnoDB
支持事务,所以要使用事务的话,表的引擎要为innodb引擎 。
了解几个术语:
管理事务处理的关键在于将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退。
事务处理用来管理INSERT、 UPDATE和DELETE语句。
事务开启: begin;
5.7之前使用 start transaction
事务回滚: rollback
--创建一个测试表
create table account (
id tinyint(5) zerofill auto_increment not null comment 'id编号',
name varchar(20) default null comment '客户姓名',
money decimal(10,2) not null comment '账户金额',
primary key (id)
)engine=innodb charset=utf8;
--插入测试数据
insert into account values(null,'张三1',11.5);
insert into account values(null,'张三2',12.5);
insert into account values(null,'张三3',13.5);
insert into account values(null,'张三4',14.5);
select * from account;--查询应该有的
begin; --开启事务或者用start transaction;
DELETE from account; --开启事务后,执行删表操作
select * from account; --查询,应该没有了
ROLLBACK; --使用rollback回滚;
select * from account; --删掉的数据神奇的回来了
--注意 truncate table 是删了表重建,事务不起作用
事务的提交,使用commit
语句
--实例
BEGIN;
DELETE from table1 where <条件>;
DELETE from table2 where <条件>;
COMMIT;
--只有当两个都删除成功,事务才算完成
隐含事务关闭 当COMMIT
或ROLLBACK
语句执行后,事务会自动关闭(将来的更改会隐含提交)。
简单的ROLLBACK和COMMIT语句就可以写入或撤销整个事务处理。但是,只是对简单的事务处理才能这样做,更复杂的事务处理可能需要部分提交或回退。 实现部分提交和回退,需要使用保留点。
savepoint <保留点名称>;
--比如:
savepoint delete1;
...
savepoint delete2;
rollback to delete1;-- 回到对应占位符位置
RELEASESAVEPOINT
明确地释放保留点。首先明确:标志为连接专用——commit操作是针对每个连接而不是服务器,也就是a客户端和b客户端是不同的。
默认的MySQL行为是自动提交所有更改。换句话说,任何时候你执行一条MySQL语句,该语句实际上都是针对表执行的,而且所做的更改立即生效。
autocommit 默认打开on:
我理解为: 当autocommit
为开启状态时(默认就是开启),即使我们没有手动开启一个事务begin
或start transaction
,mysql 会默认将用户的操作当做一个事务即时提交,一条SQL执行完就提交一次。
如果我们手动开启一个事务,begin
: 那么在begin
————commit
之间的SQL整体算一个事务,需要我们手动commit提交。
autocommit 设置为off 时:
首先,系统会默认开启了事务,并不会默认提交。也就是每条sql 我们不执行commit,在最后其实事务是没有关闭的。这个时候另一个客户端看到的数据 还是sql执行之前的数据。
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
举个例子:
A客户端:set autocommit=0
关闭状态;做了一些列增删改操作,,但是没有执行commit之前。B客户端看到的数据是没有任何变化的。