zoukankan      html  css  js  c++  java
  • Mysql事务处理

    在各项管理制度的交易都有着广泛的应用,让我们的人事管理系统,大多数同步数据库操作非常需要使用事务处理。例如,管理系统中。你删除一个人员,你即须要删除人员的基本资料,也要删除和该人员相关的信息。如信箱,文章等等,这样。这些数据库操作语句就构成一个事务!


    删除的SQL语句
    deletefrom userinfo where ~~~
    delete from mail where ~~
    delete fromarticle where~~
    ~~
    如果没有事务处理。在你删除的过程中,如果出错了,仅仅运行了第一句,那么其后果是难以想象的!
    但用事务处理。假设删除出错,你仅仅要rollback就能够取消删除操作(事实上是仅仅要你没有commit你就没有确实的运行该删除操作)

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



    查看inodb信息
    shell> /usr/local/mysql -u root -p
    mysql> showvariables like "have_%"
    系统会提示:
    +------------------+-------+
    |Variable_name | Value |
    +------------------+-------+
    |have_bdb | YES |
    | have_crypt | YES |
    |have_innodb | YES |
    | have_isam | YES |
    |have_raid | YES |
    | have_symlink | YES |
    |have_openssl | NO |
    | have_query_cache | YES |
    +------------------+-------+
    8 rows in set (0.05sec)
    假设是这种,那么我们就能够创建一张支持事务处理的表来试试了。



    MYSQL
    的事务处理功能!



    作者:Feifengxlq Email:feifengxlq@sohu.com
    一直以来我都以为MYSQL不支持事务处理,所以在处理多个数据表的数据时,一直都非常麻烦(我是不得不将其写入文本文件,在系统又一次载入得时候才写入数据库以防出错)~今天发现MYSQL数据库从4.1就開始支持事务功能。据说5.0将引入存储过程^_^
    先简介一下事务吧!事务是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
    开启自己主动提交
    来实现事务的处理。
    但注意当你用setautocommit=0的时候。你以后全部的SQL都将做为事务处理。直到你用commit确认或rollback结束,注意当你结束这个事务的同一时候也开启了个新的事务!

    按第一种方法仅仅将当前的作为一个事务!
    个人推荐使用第一种方法!
    MYSQL
    中仅仅有INNODBBDB类型的数据表才干支持事务处理。其它的类型是不支持的!(切记!



    下次有空说下MYSQL的数据表的锁定和解锁!

    MYSQL5.0 WINXP
    下測试通过~ ^_^

    mysql>use test;
    Database changed
    mysql> CREATE TABLE `dbtest`(
    -> id int(4)
    -> ) TYPE=INNODB;
    Query OK, 0 rowsaffected, 1 warning (0.05 sec)

    mysql> select * from dbtest
    -> ;
    Empty set (0.01 sec)

    mysql> begin;
    QueryOK, 0 rows affected (0.00 sec)

    mysql> insert into dbtestvalue(5);
    Query OK, 1 row affected (0.00 sec)

    mysql>insert into dbtest value(6);
    Query OK, 1 row affected (0.00sec)

    mysql> commit;
    Query OK, 0 rows affected (0.00sec)

    mysql> select * from dbtest;
    +------+
    | id |
    +------+
    | 5 |
    | 6 |
    +------+
    2 rows in set(0.00 sec)

    mysql> begin;
    Query OK, 0 rows affected (0.00sec)

    mysql> insert into dbtest values(7);
    Query OK, 1row affected (0.00 sec)

    mysql> rollback;
    Query OK, 0rows affected (0.00 sec)

    mysql> select * fromdbtest;
    +------+
    | id |
    +------+
    | 5 |
    | 6|
    +------+
    2 rows in set (0.00sec)

    mysql>

    *******************************************************************************************************************

    [PHP]
    functionTran( $sql ) {
    $judge = 1;
    mysql_query('begin');
    foreach ($sql as $v) {
    if ( !mysql_query($v) ) {
    $judge =0;
    }
    }
    if ($judge == 0){
    mysql_query('rollback');
    return false;
    }
    elseif ($judge == 1) {
    mysql_query('commit');
    return true;
    }
    }
    [/PHP]

    ************************************************

    <?php
    $handler=mysql_connect("localhost","root","");
    mysql_select_db("task");
    mysql_query("SETAUTOCOMMIT=0");//
    设置为不自己主动提交,由于MYSQL默认马上运行
    mysql_query("BEGIN");//
    開始事务定义
    if(!mysql_query("insertinto trans (id)values('2')"))
    {
    mysql_query("ROOLBACK");//
    推断当运行失败时回滚
    }
    if(!mysql_query("insertinto trans (id)values('4')"))
    {
    mysql_query("ROOLBACK");//
    推断运行失败回滚
    }
    mysql_query("COMMIT");//
    运行事务
    mysql_close($handler);
    ?>

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    编写程序计算所输日期是当年的第几天
    如何使提取的星期为中文
    Recordset.State 属性
    Dependency Walker Frequently Asked Questions
    setlocale
    StringBuilder 拼接sql语句比较快
    用sql 语句给字段添加描述
    委托事件
    将一个tabel加到另一个table
    winform的tab跳到下一个
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4854737.html
Copyright © 2011-2022 走看看