Mysql事务是通过提交和回滚来实现的

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