Mysql事务是通过提交和回滚来实现的
事务的回滚和提交能够确保尚未完成全部操作不影响数据库的使用,其次确保你自己操作设计的表和数据不会被其他人修改。
一:使用事务 start transaction
执行的顺序:发出一条 start transaction 或者(BEGIN)挂起自动提交模式------执行本次事务的命令语句----最后使用一条commit结束事务并把他们永久计入数据库
万一在事务过程中出现错误,用一条rollback撤销事务并把数据库恢复到事务开始之前的状态
start transaction语句“挂起”自动提交模式。在事务提交或者回滚之后,该模式将恢复到本次事务的start transaction语句执行之前的状态(如果是自动提交模式是激活的,结束事务将回到自动提交模式。如果原来禁用则结束当前事务开始下一个事务)
案例:
- mysql> create table pp (name varchar(20),unique(name)) engine = innodb; #说明事务只支持innodb和Falcin引擎
- mysql> start transaction;
- mysql>insert into pp set name = 'wang';
- mysql>insert into pp set name = 'li';
- mysql>commit;
- mysql> select * from pp;
- +------+
- | name |
- +------+
- | li |
- | wang |
- +------+
现在开始下一个事务看看会发生什么情况。
- mysql> start transaction;
- Query OK, 0 rows affected (0.00 sec)
- mysql> insert into pp set name = 'zhang';
- Query OK, 1 row affected (0.00 sec)
- mysql> insert into pp set name = 'wang';
- ERROR 1062 (23000): Duplicate entry 'wang' for key 'name';
- mysql> rollback;
- Query OK, 0 rows affected (0.00 sec)
- mysql> select * from pp;
- +------+
- | name |
- +------+
- | li |
- | wang |
- +------+
wang 这个用户由于在上一个事务中已经插入存在,而且name是unique,所以报错 然后使用rollback撤销事务。
即使第一条的zhang插入成功也会不会保存数据库里。
二 使用事务 set autocommit
执行事务的另外一个办法就是set语句直接改变自动提交模式的状态;
set autocommit = 0;
set autocommit = 1;
设置为0禁用自动提交模式,其效果是随后任何语句都成为当前事务的一部分知道你发出commit或者rollback保存或者撤销为止。
如果使用这个办法,自动提交模式的状态一直保持下去知道你把他设置会原来状态,所以结束一个事务就开启了下一个事务。
案列2:
- mysql> drop table pp;
- Query OK, 0 rows affected (0.01 sec)
- mysql> create table pp (name varchar(20),unique(name)) engine = innodb;
- Query OK, 0 rows affected (0.07 sec)
- mysql> set autocommit = 0 ;
- Query OK, 0 rows affected (0.00 sec)
- mysql> insert into pp set name = 'wang';
- Query OK, 1 row affected (0.00 sec)
- mysql> insert into pp set name = 'li';
- Query OK, 1 row affected (0.00 sec)
- mysql> commit;
- Query OK, 0 rows affected (0.00 sec)
- mysql> select * from pp;
- +------+
- | name |
- +------+
- | li |
- | wang |
- +------+
- 2 rows in set (0.00 sec)
上述出现commit保存,到此为止一下输入的语句自动生成一个新的事物
- mysql> insert into pp set name = 'ke';
- Query OK, 1 row affected (0.00 sec)
- mysql> insert into pp set name = 'li';
- ERROR 1062 (23000): Duplicate entry 'li' for key 'name'
- mysql> rollback;
- Query OK, 0 rows affected (0.01 sec)
- mysql> select * from pp;
- +------+
- | name |
- +------+
- | li |
- | wang |
- +------+
- 2 rows in set (0.00 sec)
如果要激活 set aotocommit = 1 ;
发出一条commit 或者 rollback会结束事务。在 其他情况下事务也会结束:set aotocommit ,start transaction,begin,commit,rollback都会对事务产生影响。
其次还有一些数据的新建删除都不能成为事务,在执行这个命令之前先提交事务
- alter table
- create index
- drop dataabase
- drop index
- drop table
- lock table
- rename table
- rename table
- set autocommit = 1
- truncate table
- unlock table
三 使用事务保存节点:
Mysql使你能够对事务进行回滚,这需要在事务过程中使用savepoint语句设置保存点。
- mysql> create table pp (name varchar(20),unique(name)) engine = innodb;
- Query OK, 0 rows affected (0.07 sec)
- mysql> start transactio;
- Query OK, 0 rows affected (0.00 sec)
- mysql> insert into pp set name = 'wang';
- Query OK, 1 row affected (0.00 sec)
- mysql>savepoint my_savepoint; ###保存节点名称为my_savepoint
- mysql> insert into pp set name = 'li';
- Query OK, 1 row affected (0.00 sec)
- mysql> rollback to savepoint my_savepoint;##恢复到my_savepoint节点状态
- mysql> commit;
- Query OK, 0 rows affected (0.00 sec)
- mysql> select * from pp;
转载于:https://blog.51cto.com/kexl908/1179375