【问题标题】:Mysql transaction not working in stored procedureMysql事务在存储过程中不起作用
【发布时间】:2016-11-24 11:14:18
【问题描述】:

我写了一个存储过程,并在开头放了这些语句:

SET autocommit = 0;

START TRANSACTION READ WRITE;

我以COMMIT; 声明结束。

但交易不工作。

你能帮忙吗?

更新 1:

这个指令可以吗

 SET @now = unix_timestamp () * 1000;

导致隐式提交?

更新2:我的代码是这样的

CREATE PROCEDURE stored_proc()

SQL SECURITY DEFINER

BEGIN

SET autocommit = 0;

START TRANSACTION;

DELETE FROM `TABLE1` WHERE `COLUMN1` = value;

INSERT INTO TABLE1...

SET @now = unix_timestamp() * 1000;

DELETE FROM TABLE2 WHERE COLUMN2 = value;

INSERT INTO `TABLE2` ...;

COMMIT;

END

我有一个显示表 TABLE2 数据的 ihm。我注意到当存储过程运行时,IHM 显示空值。这意味着提交是在第二次 DELETE 之后和 INSERT 之前进行的

更新 3

select @@tx_isolation; 在结果末尾给我REPEATABLE-READshow create table table2给我engine = InnoDB

【问题讨论】:

  • 你在使用 InnoDB 吗? MyISAM 不实现事务。
  • 是的,我正在使用 innodb。
  • 当你说它“不工作”时会发生什么,你怎么知道它不工作?您在更新中的代码不会导致隐式提交,例如任何 ddl 代码(如alter table)都会这样做。你应该添加你的整个过程(你可以缩写,确切的代码是不相关的,例如只写select ...)并描述(没有)发生什么以及你期望什么。顺便说一句,您不需要使用set autocommit = 0 来启动事务,start transaction 用于启动事务。 commit 不会将 autocommit 重置为 1,因此从现在开始您将需要 commit
  • 有人可以帮忙吗?
  • 感谢您的更新,现在您的要求更清楚了。如果您使用 MyISAM 表(不支持事务)或隔离级别设置得太低,则应该会发生这种行为。尝试:show create table table2,然后在输出的末尾查找类似engine = MyISAMengine = InnoDB 的内容。要查看您的隔离级别,请使用 select @@tx_isolation;

标签: mysql transactions


【解决方案1】:

问题是在我的 java 代码中,我有

<Resource username="$user" url="$url" type="javax.sql.DataSource" password="$pwd" name="$jndi" maxWait="-1" maxIdle="$idle" maxActive="$max" driverClassName="com.mysql.jdbc.Driver" defaultTransactionIsolation="READ-UNCOMMITTED" /> 

我更新了 defaultTransactionIsolation="REPEATABLE_READ" 非常感谢@Solarflare 的帮助。我没有考虑过隔离级别。

【讨论】:

    猜你喜欢
    • 2012-04-07
    • 2018-03-28
    • 1970-01-01
    • 2012-04-15
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多