我正在开发一个使用Spring IoC和JDBC Template类的Java应用程序.我有一个DAO类有4种方法:m1()到m4().m1在表t1上执行多次插入和更新,在t2上执行m2,在t3上执行m3等.
DAO方法使用如下:
while(true)
{
//process & generate data
dao.m1(data1);
dao.m2(data2);
dao.m3(data3);
dao.m4(data4);
//sleep
}
Run Code Online (Sandbox Code Playgroud)
我希望4个连续方法调用下的db操作是原子的,要么所有4个表都成功更新,要么都没有.因此,如果在m3()中执行操作时出错,我想回滚在m2和m1中执行的所有更改(更新和插入).
那么春天让你以下面的方式做到这一点?
while (true)
{
//process & generate data
transaction = TransactionManager.createNewTransaction();
transaction.start()
try
{
dao.m1(data1);
dao.m2(data2);
dao.m3(data3);
dao.m4(data4);
}
catch(DbUpdateException e)
{
transaction.rollBack();
}
transaction.end();
// sleep
Run Code Online (Sandbox Code Playgroud)
}
或者有更好的方法吗?
string[] usersToAdd = new string[] { "asd", "asdert", "gasdff6" };
using (Entities context = new Entities())
{
foreach (string user in usersToAdd)
{
context.AddToUsers(new User { Name = user });
}
try
{
context.SaveChanges(); //Exception thrown: user 'gasdff6' already exist.
}
catch (Exception e)
{
//Roll back all changes including the two previous users.
}
Run Code Online (Sandbox Code Playgroud)
或者这可能是自动完成的,这意味着如果发生错误,则会针对所有更改取消提交更改.是吗?
有很多关于如何在git中"撤消"合并并不容易的讨论.简短版本:如果撤消合并提交,它还会告诉git以后永远不会将这些更改合并.
在进行合并时我能做些什么来减轻这个问题吗?在很多情况下,只需在软件开发的正常过程中撤消合并就非常非常有用,更重要的是,在需要回滚更改时控制发布分支的状态.
编辑
我已经看到了本文中的解决方案,并没有真正认为它是一个解决方案,更多的是对问题的解释.这个需要
我想要的是
以下是它在Subversion中的工作原理.假设我有一个名为"release-candidate"的分支,这是我们在登台服务器上运行的以及我们尝试使用功能的地方.假设我在功能A分支中合并.在Subversion中,它只是一个变更集,并且所有文件的所有历史记录都已合并.假设我们不喜欢它,所以我们想把它拿出来.我们只是撤消单个变更集,而不必考虑其他任何事情.我们可以在将来的任何时候将功能分支A合并回来,而不必记住我们在某一点将其合并并将其取出.
我希望能够尽可能接近这种流程.我想优化"不必记住未来的东西",即使它让事情在某种程度上采取了更多的步骤.(这可能是不可能的......)
我犯了一个大错,我执行了这个查询:
update Contact set ContaPassword = '7FD736A3070CB9766'
Run Code Online (Sandbox Code Playgroud)
我忘记了这个WHERE
条款,所以这样就更新了所有用户的密码.:(
有没有办法在此查询之前恢复数据?
try
{
Connection conn = ... MySQL connection ...;
conn.setAutoCommit(false); // transaction starts
.... do something ....
}
catch (MySQLException e)
{
try {
conn.rollback();
}
catch (Exception e)
{
// What happens now?
}
}
Run Code Online (Sandbox Code Playgroud)
对于MySQL服务器(InnoDB Engine),如果事务的rollback()失败会发生什么?(即当rollback()正在运行时网络正常运行,等等...)
这是否意味着数据库仍然存在损坏,或者MySQL服务器是否有办法从"未完成"的回滚中恢复?
我有以下情况.
我有一个REST客户端,作为其他3个REST客户端的外观.(我用Java编程,使用Spring Boot)
客户的责任之一包括对用户进行CRUD操作.
现在,暴露自己的REST API的所有其他3个系统都有某种用户管理.
当我收到创建用户的请求时,我必须通过他们的REST API在这3个系统上创建它们并在我的数据库中保留.
现在,在最好的情况下,我只需调用他们的API,将用户插入我的数据库中,一切都很棒.
但是,请考虑用户创建仅在1个外部服务上成功的情况.我是否会重试所有其他操作?我是否尝试删除用户已被取代的用户?
这样做的正确方法是什么?
我的SQLAlchemy应用程序(在MariaDB之上运行)包括两个模型MyModelA
,MyModelB
后者是前者的子记录:
class MyModelA(db.Model):
a_id = db.Column(db.Integer, nullable=False, primary_key=True)
my_field1 = db.Column(db.String(1024), nullable=True)
class MyModelB(db.Model):
b_id = db.Column(db.Integer, nullable=False, primary_key=True)
a_id = db.Column(db.Integer, db.ForeignKey(MyModelA.a_id), nullable=False)
my_field2 = db.Column(db.String(1024), nullable=True)
Run Code Online (Sandbox Code Playgroud)
这些的实例MyModelA
和MyModelB
我创建:
>>> my_a = MyModelA(my_field1="A1")
>>> my_a.aid
1
>>> MyModelB(a_id=my_a.aid, my_field2="B1")
Run Code Online (Sandbox Code Playgroud)
我有以下代码删除MyModelA
where 的实例a_id==1
:
db.session.commit()
try:
my_a = MyModelA.query.get(a_id=1)
assert my_a is not None
print "#1) Number of MyModelAs: %s\n" % MyModelA.query.count()
db.session.delete(my_a)
db.session.commit()
except IntegrityError:
print "#2) Cannot delete instance …
Run Code Online (Sandbox Code Playgroud) 我试图找到一种简单的方法来回滚到我的 firebase 函数(谷歌云函数)的先前版本,以防此 firebase 函数的新版本对已部署的系统造成问题。
我部署函数的方式是通过 firebase cli(firebase deploy --only 函数)而不是 gcloud cli。
有没有简单的方法可以回滚到该函数的先前版本?
我正在为 PostgreSQL 编写一个脚本,因为我希望它以原子方式执行,所以我将它包装在一个事务中。
我希望脚本看起来像这样:
BEGIN
-- 1) Execute some valid actions;
-- 2) Execute some action that causes an error.
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END; -- A.k.a. COMMIT;
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,pgAdmin 在初始BEGIN
. 如果我通过像这样附加分号来终止命令:BEGIN;
它会通知我附近的错误EXCEPTION
。
我意识到我可能混淆了控制结构和事务的语法,但是我在文档中找不到任何关于如何回滚失败事务的内容(也没有在 SO 中)。
我还考虑过事务可能会在出错时自动回滚,但由于以下脚本,情况似乎并非如此:
BEGIN;
-- 1) Execute some valid actions;
-- 2) Execute some action that causes an error.
COMMIT;
Run Code Online (Sandbox Code Playgroud)
警告我:ERROR: current transaction is aborted, commands ignored until end of transaction block
然后我必须手动ROLLBACK;
进行交易。
似乎我在这里遗漏了一些基本的东西,但是什么?
编辑:
我也试过DO
像这样使用: …
我们最近被空降到一个新的 ETL 项目,该项目的代码非常糟糕。我手中有一个包含 700 行和各种更新的查询。
我想对其进行调试SET XACT_ABORT ON;
,目标是如果只有一个事务失败则回滚所有内容。
但我找到了几种将其存档在 StackOverflow 上的方法,如下所示:
BEGIN TRANSACTION;
BEGIN TRY
-- Multiple sql statements goes here
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
END CATCH
Run Code Online (Sandbox Code Playgroud)
或这个:
BEGIN TRY
BEGIN TRANSACTION
-- Multiple sql statements goes here
COMMIT TRANSACTION
END TRY
BEGIN CATCH
PRINT(ERROR_MESSAGE())
ROLLBACK TRANSACTION
END CATCH
Run Code Online (Sandbox Code Playgroud)
而这些都没有用途SET XACT_ABORT ON;
。
我不明白,和SET XACT_ABORT ON
使用一样吗BEGIN TRY BEGIN TRANSACTION
?
我可以只使用:
SET XACT_ABORT ON;
-- Multiple …
Run Code Online (Sandbox Code Playgroud) rollback ×10
transactions ×5
java ×3
mysql ×2
spring ×2
c# ×1
exception ×1
firebase ×1
git ×1
jdbc ×1
merge ×1
node.js ×1
plpgsql ×1
postgresql ×1
python ×1
rest ×1
savechanges ×1
sql ×1
sql-server ×1
sqlalchemy ×1
t-sql ×1
try-catch ×1
undo ×1
xact-abort ×1