日期:2014-05-16  浏览次数:20752 次

mysql存储过程中事务操作
转自:http://hi.baidu.com/yangjie312/blog/item/ef67d9f9e6daa810a8d311d1.html

案例一

   1. mysql> DELIMITER $$
   2. mysql> DROP PROCEDURE IF EXISTS `transaction1`$$
   3. Query OK, 0 rows affected (0.00 sec)
   4.
   5. mysql> CREATE PROCEDURE transaction1()
   6.      -> BEGIN
   7.      ->  set autocommit = 0;
   8.      ->  insert IGNORE into t3 (id) values (1);
   9.      ->  insert IGNORE into t3 (idrr) values (2);
  10.      ->   if @@warning_count   <> 0 then
  11.      ->          rollback;
  12.      ->  else
  13.      ->          commit;
  14.      ->  end if;
  15.      -> END$$
  16. Query OK, 0 rows affected (0.00 sec)
  17.
  18. mysql> DELIMITER ;
  19. mysql> call transaction1();
  20. Query OK, 0 rows affected, 1 warning (0.06 sec)
  21.
  22. mysql> select * from t3;
  23. Empty set (0.00 sec)
  24.
  25. mysql>

案例二

   1. mysql> DELIMITER $$
   2. mysql> DROP PROCEDURE IF EXISTS `transaction1`$$
   3. Query OK, 0 rows affected (0.00 sec)
   4.
   5. mysql> CREATE PROCEDURE transaction1()
   6.      -> BEGIN
   7.      ->  set autocommit = 0;
   8.      ->  insert IGNORE into t3 (id) values (1);
   9.      ->  insert IGNORE into t3 (idrr) values (2);
  10.      ->   if @@warning_count   <> 0 ||@@error_count>0 then
  11.      ->          rollback;
  12.      ->  else
  13.      ->          commit;
  14.      ->  end if;
  15.      -> END$$
  16. Query OK, 0 rows affected (0.00 sec)
  17.
  18. mysql> DELIMITER ;
  19. mysql> call transaction1();
  20. Query OK, 0 rows affected, 1 warning (0.06 sec)
  21.
  22. mysql> select * from t3;
  23. Empty set (0.00 sec)
  24.
  25. mysql>

要使mysql支持事务,表类型要用: InnoDB


1、 隔离级别


SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED |REPEATABLE READ | SERIALIZABLE}

默认为:REPEATABLE READ

在SQL99中,为了实现事务的完全隔离,定义了三种必须避免的现象:


1、读"脏"数据(dirty read):即事务在运行中读到了其它事务未提交的数据。
2、不可重复读(unrepeatable read):即事务在运行中再次读取同一数据时,可发现其它事务的更新。
3、"幻象"读(phantom read):即事务在运行中再次执行同一查询时,发现其它事务的更新。

只有避免上面三种现象,才能实现真正意义上的隔离,或者称是可串行的。但是,此时事务之间因为冲突而等待的机会非常高,系统的性能可能难以达到预期的目标。 为了实现隔离性与系统性能之间的平衡,SQL99定义了四种隔离级别, 允许应用根据实际需要选择合适的隔离级别 馑闹指衾爰侗鸬暮 迦缦拢?nbsp;

读"脏"数据 不可重复读 "幻象"读
未提交读READ UNCOMMITTED N N N
提交读READ COMMITTED Y N N
可重复读REPEATABLE READ Y Y N
可串行SERIALIZABLE Y Y Y

其中"N"表示在这种隔离级别下,对应的现象不可避免,而"Y"则 表示可以避免。

2、 事务语句


START