我有一个存储过程,其中只执行3个存储过程。如果主SP成功,我只使用一个参数来存储。
如果第一个存储过程在主存储过程中工作良好,但是第二个存储过程失败,那么它会自动回滚主SP中的所有SP,还是必须发出一些命令?
这是我的程序:
CREATE PROCEDURE [dbo].[spSavesomename]
-- Add the parameters for the stored procedure here
@successful bit = null output
AS
BEGIN
begin transaction createSavebillinginvoice
我在DAO层中有调用Oracle数据库中存储过程的方法:
@Override
public void deleteNode(Integer nodeId) {
SqlParameterSource in = new MapSqlParameterSource()
.addValue("nodeId",nodeId)
.addValue("user", "DUMMY");
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(ebDat
如果满足某个条件,我就不希望插入(事务应该回滚)。我可以在应用程序代码中编写这个逻辑,但是由于某种原因,它必须用MySQL本身编写(假设用不同语言编写的客户机将插入到这个MySQL InnoDB表中),这是一个单独的讨论。
表定义:
CREATE TABLE table1(x int NOT NULL);
触发器看起来如下所示:
CREATE TRIGGER t1 BEFORE INSERT ON table1
FOR EACH ROW
IF (condition) THEN
NEW.x = NULL;
END IF;
END;
我猜它也可以写成(未经测试):
CREATE T
我有这个SQL代码来检查一些参数,如果无效将引发错误,我还希望将错误记录插入到错误表中。问题是,如果发生错误,整个事务将被回滚,包括错误记录,我希望回滚除错误记录之外的整个事务。
我尝试创建一个单独的事务,但没有成功地提交它。
IF @Input IS NULL
BEGIN
insert into [dbo].Errors('Field1') values ('Input is null')
RAISERROR ('some message', 16, 1)
RETURN -1
END
有
我们正在开发一个应用程序,有时需要从SQL表中删除(一些)条目,并将它们替换为一个新的行列表。在我们的应用程序中,逻辑是:
Delete relevant_entries using delete_stored_procedure
For Each new_entry in new_entries
Insert new_entry using insert_stored_procedure
这种逻辑是可行的,但有一个陷阱。如果DELETE工作,但是其中一个插入失败了怎么办?我们需要能够将数据库恢复到删除表行和插入任何先前条目之前的状态。有没有办法做到这一点,只恢复这些事情,而不影响任何其
我有以下MYSQL查询:
START TRANSACTION;
SELECT sport_id INTO @a FROM sports WHERE sport_id = 2 FOR UPDATE;
UPDATE sports SET sport_name = 'Table Tennis' WHERE sport_id = @a;
if (@a > 1) then
COMMIT;
ELSE
ROLLBACK;
END IF;
问题是它在if语句处返回一个错误:
#1064 -您的SQL语法出现了错误;请检查与您的MySQL服务器版本对应的手册,以获得
我又一次感到困惑。
昨晚在一些大型查询中,服务器崩溃了。早上重启后,MySQL进入恢复模式。我需要关闭MySQL服务,它正在等待.如日志所述,我假设未提交事务的后台回滚,但它已经在热服务器上停留了9个多小时,看不到尽头。
当服务重新启动时,进程能否安全地中断并在后台恢复?还是我们要等着喘息。
任何输入或想法(甚至是关于正在发生的事情的信息)都将是非常有用的。提前,谢谢。
我们正在运行MySQL 5.5。
下面是日志输出:
140930 9:04:30 InnoDB: Starting an apply batch of log records to the database...
Inno
有时我会看到下面的代码片段。begin try什么时候需要if @@trancount > 0?他们两个?或者这是一种安全的方式(最佳实践),总是检查它,以防它在检查之前回滚?
begin tran
begin try
... just several lines of sql ...
if @@trancount > 0 commit tran
end try
begin catch
if @@trancount > 0 rollback tran
end catch
作为,
如果我有一个内部存储过程,这总是没有错误回滚。
CREATE PROCEDURE [inner] AS BEGIN
SET XACT_ABORT, NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION;
IF (1 + 1 = 2) BEGIN
ROLLBACK TRANSACTION;
END ELSE BEGIN
COMMIT TRANSACTION;
END
END TRY
BEGIN
考虑一个场景。我已经在INSERT操作上创建了触发器的表T1。和存储过程如下所示。
//StoredProcedure.sql
BEGIN TRANSACTION;
...
...
INSERT INTO TABLE T1
/* Trigger will be executed on record insertion in Table T1 */
.....
.....
.....
.....
Consider some error here...
.....
.....
COMMIT TRANSACTION;
.....
.....
ROLLBACK TRANSACTION;
On Err
我有两张桌子。Mysql 5.7,表中有Innodb存储引擎。
create table test_tran (id integer, descr varchar(255));
create table test_enum (id int, flag enum('good','not good') not null);
一个有效的记录插入到test_enum表中
insert into test_enum values(1,'good')
我使用已定义事务的存储过程来尝试更新枚举列中的无效值。它还捕获错误以回滚事务,然后重发错误。
SET sq
这是我的第一篇Stack Overflow帖子!社区得到了很大的帮助!
我有一个90K行的CSV,我正试图通过一个带有CSV的临时表插入到一个表中,如下所示:
CREATE TEMPORARY TABLE temp_product like product;
LOAD DATA LOCAL INFILE "myfile.csv"
...
但我正试图通过一个过程来完成插入和一些额外的操作,该过程包含一个事务和一个退出处理程序,以防任何操作失败或抛出警告:
CREATE PROCEDURE update_products ()
BEGIN
DECLARE EXIT HAND
我在一个文件中有sql,其中包含许多语句。如何让mysql在不执行的情况下检查sql的合法性? 就像这样 mysql --check-only input.sql 至少,我需要检查语法。 理想情况下,它还会尝试插入数据和检查约束。基本上将整个文件包装在一个隐式事务中,该事务会自动回滚。 mysql CLI可以做到这一点吗?
我希望在当前项目中使用多个上下文/模式,但我不太确定在单个事务中如何正确地将对上下文的写访问包装起来。
我的理解是,有两种方法可以实现这一点:DbContext.Database.BeginTransaction()和TransactionScope。我不确定的是,我是否正确地使用它们和/或是否有其他方法这样做。
示例:
假设以下模型/上下文
public class A
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
public class ContextA : DbConte