mysql事务处理

MYSQL--事务处理

事务处理在各种管理系统中都有着广泛的应用,比如人员管理系统,很多同步数据库操作大都需要用到事务处理。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
    
删除的SQL语句
delete from userinfo where ~~~
delete from mail where ~~
delete from article where~~
~~
  
如果没有事务处理,在你删除的过程中,假设出错了,只执行了第一句,那么其后果是难以想象的!
但用事务处理。如果删除出错,你只要rollback就可以取消删除操作(其实是只要你没有commit你就没有确实的执行该删除操作)

  
一般来说,在商务级的应用中,都必须考虑事务处理的!

事务是DBMS得执行单位。它由有限得数据库操作序列组成得。但不是任意得数据库操作序列都能成为事务。一般来说,事务是必须满足4个条件(ACID

      原子性(Autmic):事务在执行性,要做到“要么不做,要么全做!”,就是说不允许事务部分得执行。即使因为故障而使事务不能完成,在rollback时也要消除对数据库得影响!

     一致性(Consistency):事务得操作应该使使数据库从一个一致状态转变倒另一个一致得状态!就拿网上购物来说吧,你只有即让商品出库,又让商品进入顾客得购物篮才能构成事务!

     隔离性(Isolation):如果多个事务并发执行,应象各个事务独立执行一样!

     持久性(Durability):一个成功执行得事务对数据库得作用是持久得,即使数据库应故障出错,也应该能够恢复!

  

   MYSQL的事务处理主要有两种方法。

   1、用begin,rollback,commit来实现

        begin 开始一个事务

        rollback 事务回滚

        commit  事务确认

    2、直接用set来改变mysql的自动提交模式

       MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过

      set autocommit=0   禁止自动提交

      set autocommit=1 开启自动提交

   来实现事务的处理。

但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!

个人推荐使用第一种方法!

   MYSQL中只有INNODBBDB类型的数据表才能支持事务处理!其他的类型是不支持的!(切记!)

 

1.       关闭自动提交功能

mysql> use test;

Database changed

mysql> set autocommit=0;

Query OK, 0 rows affected (0.06 sec)

2.       查看t1表内容

mysql> select * from t1;

+------+----+

| name | id |

+------+----+

| aaaa |  1 |

| bbbb |  2 |

| cccc |  3 |

| dddd |  4 |

| eeee |  5 |

| ffff |  6 |

+------+----+

6 rows in set (0.00 sec)

 

3.  从表t1中删除了一条记录

mysql> delete from t1 where id=6;

Query OK, 1 row affected (0.00 sec)

 

4.  查看表t1的内容:

mysql> select * from t1;

+------+----+

| name | id |

+------+----+

| aaaa |  1 |

| bbbb |  2 |

| cccc |  3 |

| dddd |  4 |

| eeee |  5 |

+------+----+

5 rows in set (0.00 sec)

 

5.  此时做一个p1还原点:

mysql> savepoint p1;

Query OK, 0 rows affected (0.00 sec)

 

6.  再次从表t1中删除一条记录:

mysql> delete from t1 where id=5;

Query OK, 1 row affected (0.00 sec)

 

7.  查看表t1的内容:

mysql> select * from t1;

+------+----+

| name | id |

+------+----+

| aaaa |  1 |

| bbbb |  2 |

| cccc |  3 |

| dddd |  4 |

+------+----+

4 rows in set (0.00 sec)

 

8.  再次做一个p2还原点:

mysql> savepoint p2;

Query OK, 0 rows affected (0.00 sec)

 

9.  此时恢复到p1还原点,当然后面的p2这些还原点自动会失效:

mysql> rollback to p1;

Query OK, 0 rows affected (0.03 sec)

 

10. 查看表t1的内容:

mysql> select * from t1;

+------+----+

| name | id |

+------+----+

| aaaa |  1 |

| bbbb |  2 |

| cccc |  3 |

| dddd |  4 |

| eeee |  5 |

+------+----+

5 rows in set (0.00 sec)

 

:在以上的有三个状态:

1)一个是没有删除以前的6

2)一个是删除了第6条后的5条记录,即savepoint p1;

3)一个是删除了第5条后的4条记录,即savepoint p2; 此时我就想恢复第二个5条记录的那个表记录,就得使用rollback to p1,如果此时用rollback

则会直接恢复到最开始的6条,这样就恢复多了.

 

11. 退回到最原始的还原点:

mysql> rollback;

Query OK, 0 rows affected (0.97 sec)

 

12. 查看表t1内容:

mysql> select * from t1;

+------+----+

| name | id |

+------+----+

| aaaa |  1 |

| bbbb |  2 |

| cccc |  3 |

| dddd |  4 |

| eeee |  5 |

| ffff |  6 |

+------+----+

6 rows in set (0.00 sec)

 

13.以上关于mysql事务处理的关键字:

1)select @@autocommit; //查看 提交状态

2)set autocommit=0; //取消自动提交

3)savepoint p1;

4)rollback to p1;

5)rollback;//如果回滚到 p1,则p2就自动失效了

6)commit; //提交,就回滚不回去了

7)set autocommit=1; //默认的 自动提交

 

你可能感兴趣的:(mysql)