mysql 存储过程 事务

jojophak 2009-05-06 10:10:03
我的mysql是5.1版本,表是innoDB
procedure1:
set autocommit = 0;
start transaction;
****
commit;

procedure2:
update a set a.b = 1 where id =1;
问题1:
mysql默认autocommit =1
如果执行了procedure1后,会不会对下次执行procedure2有影响??
就是说执行了procedure1后,procedure2执行时autocommit是不是还是1???
问题2:
mysql是不是对如下存储过程自动执行事务?
procedure3:
update a set a.id = 1 where id =2;
update b set b.id = 1 where id =2;
...全文
1578 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanzheng45 2010-12-14
  • 打赏
  • 举报
回复
支持支持 别看枯燥的文档学习效率高。
jojophak 2009-07-25
  • 打赏
  • 举报
回复
实际应用是在程序中使用的事务,遇到的这个问题就用简单的异常处理解决的
wangzi6hao 2009-07-13
  • 打赏
  • 举报
回复
嗯,几位真有耐心,我也学到了很多东西,谢谢大家。
jojophak 2009-05-06
  • 打赏
  • 举报
回复
谢谢,
对于set autocommit = 0;
如果执行成功需要 commit;
如果不成功,要不要显示 执行rollback?如果需要的话,根据什么来判断多个update 或 delete 都执行成功了呢?
感觉mysql手册讲得不详细
ACMAIN_CHM 2009-05-06
  • 打赏
  • 举报
回复

一个简单的试验,你可以看到在 p1中设置的autocommit=0,运行完p1,p2后然后rollback会把p1,p2把插入的记录全部回滚掉。

mysql> create table tab1 (
-> id int primary key
-> ) ENGINE=InnoDB ;
Query OK, 0 rows affected (0.09 sec)

mysql> insert into tab1 values (1);
Query OK, 1 row affected (0.08 sec)

mysql> select * from tab1;
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)

mysql>
mysql> CREATE PROCEDURE p1 ()
-> BEGIN
-> set @@autocommit =0;
-> insert into tab1 values (11);
-> end
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE PROCEDURE p2 ()
-> begin
-> insert into tab1 values (12);
-> end
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql>
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)

mysql> call p1();
Query OK, 1 row affected (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 0 |
+--------------+
1 row in set (0.00 sec)

mysql> call p2();
Query OK, 1 row affected (0.00 sec)

mysql> select * from tab1;
+----+
| id |
+----+
| 1 |
| 11 |
| 12 |
+----+
3 rows in set (0.00 sec)

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

mysql> select * from tab1;
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)

mysql>
jojophak 2009-05-06
  • 打赏
  • 举报
回复
现在我没有加start transaction;
只有commit;
应该没有问题吧
WWWWA 2009-05-06
  • 打赏
  • 举报
回复
最好显式
start transaction;
.....
commit;
jojophak 2009-05-06
  • 打赏
  • 举报
回复
InnoDB
jojophak 2009-05-06
  • 打赏
  • 举报
回复
我现在做这个试验的目的是
我有的procedure 有
set autocommit =0;
start transaction;
commit;

有的procedure 没有
可能直接就是
create prcedure p
begin
update table set a =1 where id = 2;
end
没有进行事务处理

没有进行事务处理的还很多
我在试验要不要把每个像这种一条语句的存储过程加上事务处理
像下面这样
create prcedure p
begin
start transaction;
update table set a =1 where id = 2;
commit;
end

WWWWA 2009-05-06
  • 打赏
  • 举报
回复
表引擎是什么?
jojophak 2009-05-06
  • 打赏
  • 举报
回复
又试了一次
1.call `test1`('test1',3) ;
2.rollback;

3.call `test2`('test2',3) ;
4.rollback;

执行 name code
1 test1 test1
3 test2 test2
一起执行 name code
1,2 test1 test1
3, 4 test1 test1//没有变成test2 test2
1,2,3,4 test1 test1
WWWWA 2009-05-06
  • 打赏
  • 举报
回复
在SP2中没有显式 start transaction
jojophak 2009-05-06
  • 打赏
  • 举报
回复
做了个小试验
在ems sql manager 2007 for mysql
pro1:
name :test1
para: _name varchar(10) _id int

set autocommit = 0;
start transaction;
update product set name = _name where id = _id;
update product set code =_name where id=_id;
commit;

pro2:
name :test2
para: _name varchar(10) _id int

update product set name = _name where id = _id;
update product set code =_name where id=_id;

先调用test1
call test1('test1',3)
执行成功
id 为3 的产品 name 和 code 改为test1

再试用 test2
call test2('test2',3)

id 为3 的产品name 和 code 也被改为了test2
按照上面的说法,调用 test2时应该改不了啊?
还是我测试有问题??
ACMAIN_CHM 2009-05-06
  • 打赏
  • 举报
回复

重启当然会恢复my.ini文件中的值或者你启动命令参数中的值了。

但对这个问题
如果执行了procedure1后,会不会对下次执行procedure2有影响??

同一connection 中你做个实现就很容易知道了。
wwwwb 2009-05-06
  • 打赏
  • 举报
回复
1、在SP1中设置后,autocommit变更为你的设置值,但重新启动后恢复为
MYSQL默认值
ACMAIN_CHM 2009-05-06
  • 打赏
  • 举报
回复

其实你自己做个测试就知道了。
jojophak 2009-05-06
  • 打赏
  • 举报
回复
谢谢各位高手
wwwwb 2009-05-06
  • 打赏
  • 举报
回复
2、如果没有设置set autocommit=0,应该是直接执行SQL语句,存入表中
将立刻将更新存储到磁盘上。
ACMAIN_CHM 2009-05-06
  • 打赏
  • 举报
回复

问题2:
mysql是不是对如下存储过程自动执行事务?

不是,要看你的autocommit设置,如果是ON, 则每句SQL后都会自动提交。如果是OFF,则要等到commit;或者DDL等之关的语句来隐式提交。

ACMAIN_CHM 2009-05-06
  • 打赏
  • 举报
回复

问题1:


如果执行了procedure1后,会不会对下次执行procedure2有影响??
会影响

就是说执行了procedure1后,procedure2执行时autocommit是不是还是1???
是0

在同一个connection中是同一个autocommit变量。任何时候的修改都会影响后面的。

加载更多回复(24)

56,681

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧