mysql---事务

转载 2013年12月04日 20:05:44

MYSQL--事务处理

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

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

 

查看inodb信息
      shell> /usr/local/mysql -u root -p
      mysql> show variables 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.05 sec)
如果是这样的,那么我们就可以创建一张支持事务处理的表来试试了。

 

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 开启自动提交
   来实现事务的处理。
但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!
个人推荐使用第一种方法!
   MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!(切记!)

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

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

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

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

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

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

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

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

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

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

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

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

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

mysql>

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

[PHP]
function Tran( $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("SET AUTOCOMMIT=0");//设置为不自动提交,因为MYSQL默认立即执行
mysql_query("BEGIN");//开始事务定义
if(!mysql_query("insert into trans (id) values('2')"))
{
mysql_query("ROOLBACK");//判断当执行失败时回滚
}
if(!mysql_query("insert into trans (id) values('4')"))
{
mysql_query("ROOLBACK");//判断执行失败回滚
}
mysql_query("COMMIT");//执行事务
mysql_close($handler);
?>


转自:http://www.cnblogs.com/in-loading/archive/2012/02/21/2361702.html

mysql---多表查询

很多应用场景下,数据查询会涉及多张表,即多表查询。这些表之间存在连结关系。 多表连结分为:内连结,外连结, 交叉连结。 针对内外连结对应不同的连结方法 内连结:(inner)join 外连结:le...
  • Techml
  • Techml
  • 2017年06月15日 14:37
  • 74

mysql---源码安装

1、安装依赖包 [root@localhost mysql-5.1.50]# yum -y install gcc gcc-c++ ncurses ncurses-devel openssl ope...
  • u010718976
  • u010718976
  • 2014年11月03日 18:46
  • 624

mysql---分区

环境: centOS6.4 32位 mysql5.1
  • xing_____
  • xing_____
  • 2014年09月07日 14:11
  • 192

mysql---运算符

1, 算术运算符+ - * / %mysql> select 0.1+0.3333, 0.1-0.3333, 0.1*0.3333, 1/2, 1%2; +------------+---------...
  • eandroidhu
  • eandroidhu
  • 2016年11月21日 11:26
  • 292

mysql---存储过程

了解存储过程之前,先了解一下mysql的控制结构。 类似C语言(if……else、while循环等)SQL也有自己的控制结构。 if……else控制结构: 例如: (1) if 判断表达式 ...
  • iamgaowei
  • iamgaowei
  • 2014年06月18日 15:09
  • 727

mysql---多表关联

nysql多表关联及左右连接、全相乘简单介绍
  • iamgaowei
  • iamgaowei
  • 2014年06月16日 11:12
  • 2732

mysql---常用函数

BIN 十进制转2进制
  • xing_____
  • xing_____
  • 2014年09月08日 22:52
  • 200

mysql---存储数据

float double(浮点数) decimal(定点数) (10, 5)第一位表示浮点数的位数,第二位表示小数点后的位数, 浮点数不加的话 默认数据不丢失,定点数不加的话默认为(10, 0)m...
  • eandroidhu
  • eandroidhu
  • 2016年11月16日 11:30
  • 328

mysql---主从复制

环境 linux6.4 32位 mysql5.1
  • xing_____
  • xing_____
  • 2014年09月03日 23:13
  • 218

mysql---日期函数

1,curdatemysql> select curdate(); +------------+ | curdate() | +------------+ | 2016-11-21 | +-----...
  • eandroidhu
  • eandroidhu
  • 2016年11月21日 15:13
  • 162
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql---事务
举报原因:
原因补充:

(最多只允许输入30个字)