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