一、 什么是事务
事务就是一段sql 语句的批处理,但是这个批处理是一个atom(原子) ,不可分割,要么都执行,要么回滚(rollback)都不执行。
二、为什么出现这种技术
为什么要使用事务这个技术呢? 现在的很多软件都是多用户,多程序,多线程的,对同一个表可能同时有很多人在用,为保持数据的一致性,所以提出了事务的概念。这样很抽象,举个例子:
A 给B 要划钱,A 的账户-1000元, B 的账户就要+1000元,这两个update 语句必须作为一个整体来执行,不然A 扣钱了,B 没有加钱这种情况很难处理(找出原因)。
三、如何在MYSQL 中使用事务
1、谁可以使用
只有InnoDB /BDB 的之类的transaction_safe table 才能支持。
默认的engine MyISAM 是不支持事务的,show engine 可以看到支持的和默认的engine。可以在[mysqld] 加入: default_storage_engine=InnoDB; InnoDB 就是建立表的默认引擎。
建立InnoDB 表:Create table .... type=InnoDB; Alter table table_name type=InnoDB;(如何查看已有表的类型: show create table table_name)
这样我们就可以在InnoDB 表上进行事务操作了!
2、如何使用
启动事务的方法:
认为分为两种:
1、begin ,rollback,commit .当然有的人用begin /begin work .推荐用START TRANSACTION 是SQL-99标准启动一个事务。
start transaction;
update from account set money=money-100 where name='a';
update from account set money=money+100 where name='b';
commit;
解释: 这样start transaction 手动开启事务,commit 手动关闭事务。
2、默认的时候autocommit=1 自动提交是开启的,所以你可以理解为每条语句一输入到mysql就commit 了。当你 set autocommit=0 时候,你可以这样:
update from account set money=money-100 where name='a';
update from account set money=money+100 where name='b';
commit;
// 默认都不提交,只有手动键入commit 时候才上述都提交。
用户下订单并且支付了,这个是两张表,用户点击确认支付的时候你得操作这两张表(最起码,可能还有其他的),但是你操作订单表成功了,操作用户账户失败了,那么订单状态是已支付、用户的钱没扣到,你们就亏了。这时候如果采用事务,可以回滚,给用户提示支付失败,数据表没有任何改动。