我已经让Django设置为在自己的线程中运行一些重复的任务,我注意到他们总是留下未完成的数据库连接进程(pgsql"Idle In Transaction").
我查看了Postgres日志,发现事务没有完成(没有ROLLBACK).我尝试在我的函数上使用各种事务装饰器,没有运气.
我切换到手动事务管理并手动执行回滚,但仍然有效,但仍将进程保留为"空闲".
所以我调用了connection.close(),一切都很顺利.
但是我想知道,为什么Django的典型事务和连接管理不适用于从主Django线程生成的这些线程任务?
我正在构建一个尝试在App_Start上安装/升级数据库的Web应用程序.部分安装过程是确保数据库安装了asp.net功能.为此,我使用System.Web.Management.SqlServices对象.
我的目的是在SQL事务中执行所有数据库工作,如果其中任何一个失败,则回滚事务并保持数据库不变.
SqlServices对象有一个方法"Install",它接受ConnectionString而不是事务.所以我使用SqlServices.GenerateApplicationServicesScripts,如下所示:
string script = SqlServices.GenerateApplicationServicesScripts(true, SqlFeatures.All, _connection.Database);
SqlHelper.ExecuteNonQuery(transaction, CommandType.Text, script, ...);
Run Code Online (Sandbox Code Playgroud)
然后我使用企业库中的SqlHelper.
但是这会引发一个异常错误的异常,其中一些是错误的
Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
Incorrect syntax near the keyword 'USE'.
Incorrect syntax near the keyword 'CREATE'.
Incorrect syntax near 'GO'.
The variable name '@cmd' has already been declared. Variable names must be unique within a query batch or stored procedure.
Run Code Online (Sandbox Code Playgroud)
我假设在SQL事务中使用GO语句存在一些问题.
如何以这种方式执行时,如何使生成的脚本生效.
我对以下模式的副作用和潜在问题很感兴趣:
CREATE PROCEDURE [Name]
AS
BEGIN
BEGIN TRANSACTION
BEGIN TRY
[...Perform work, call nested procedures...]
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
END
Run Code Online (Sandbox Code Playgroud)
据我所知,当使用单个过程时,此模式是合理的 - 过程将完成所有语句而不会出错,或者它将回滚所有操作并报告错误.
但是,当一个存储过程调用另一个存储过程来执行某个子工作单元时(理解为较小的过程有时会单独调用),我看到与回滚有关的问题 - 一条信息性消息(级别16)发表声明The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION..我假设是因为子过程中的回滚总是回滚最外层事务,而不仅仅是子过程中启动的事务.
我确实希望整个事情回滚并在发生任何错误时中止(并且错误报告给客户端作为SQL错误),我只是不确定外层试图回滚事务的所有副作用已经回滚过了.也许@@TRANCOUNT在每个TRY CATCH层进行回滚之前检查一下?
最后是客户端(Linq2SQL),它有自己的事务层:
try
{
var context = new MyDataContext();
using (var transaction = new TransactionScope())
{
// Some Linq stuff
context.SubmitChanges();
context.MyStoredProcedure();
transactionComplete();
}
}
catch
{
// An …Run Code Online (Sandbox Code Playgroud) 我无法使用或了解如何从后台堆栈中弹出FragmentTransactions来处理自定义动画.具体来说,我希望它能够调用"out"动画,但似乎并没有.
我有一个简单的方法来处理片段事务(FragmentTransaction),我在其中添加片段并应用自定义转换以使其淡入/淡出.我还将此添加到后台堆栈,以便用户可以使用后退按钮撤消该事务,实际上导航到添加片段之前的状态.
protected void changeFragment() {
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
ft.add(R.id.fragment_container, new TestFragment());
ft.addToBackStack(null);
ft.commit();
}
Run Code Online (Sandbox Code Playgroud)
一切都很好地向前发展,但当用户点击后退按钮时,过渡动画不会反转.我所期待的是当片段被删除时,它将使用淡出动画.相反它似乎弹出(没有动画),然后容器似乎淡入.我不确定这是发生了什么,但片段绝对不会淡出.
我的应用程序使用兼容性库来添加片段支持,但我认为这也适用于Honeycomb(android-11).有谁知道我在这里做错了什么,或者我只是期待太多?理想情况下,我想为片段设置动画,类似于Gmail(在Xoom上)通过单击消息然后使用后退按钮向后移动的方式.最好不必覆盖后退按钮功能并跟上我自己的片段状态,因为我可能有几个"交易",我想要退出,我不是重新发明轮子的粉丝.
Android开发者小组也问过:http://groups.google.com/group/android-developers/browse_thread/thread/1136a3a70fa0b6e9
animation android transactions transitions android-fragments
正如先前的Stack Overflow问题(TransactionScope和连接池以及SqlConnection如何管理IsolationLevel?)所证明的那样,事务隔离级别在SQL Server和ADO.NET(也是System.Transactions和EF)的池化连接中泄漏,因为它们建立在ADO.NET).
这意味着,在任何应用程序中都可能发生以下危险事件序列:
问题:防止这种情况的最佳方法是什么?现在到处都需要使用显式交易吗?
这是一个独立的复制品.您将看到第三个查询将继承第二个查询中的Serializable级别.
class Program
{
static void Main(string[] args)
{
RunTest(null);
RunTest(IsolationLevel.Serializable);
RunTest(null);
Console.ReadKey();
}
static void RunTest(IsolationLevel? isolationLevel)
{
using (var tran = isolationLevel == null ? null : new TransactionScope(0, new TransactionOptions() { IsolationLevel = isolationLevel.Value }))
using (var conn = new SqlConnection("Data Source=(local); Integrated Security=true; Initial Catalog=master;"))
{
conn.Open();
var cmd = new SqlCommand(@"
select
case transaction_isolation_level
WHEN 0 THEN 'Unspecified'
WHEN 1 THEN …Run Code Online (Sandbox Code Playgroud) Node.js 7及更高版本已经支持async/await语法.我应该如何使用sequelize事务的async/await?
我试图在Django中以原子方式递增一个简单的计数器.我的代码看起来像这样:
from models import Counter
from django.db import transaction
@transaction.commit_on_success
def increment_counter(name):
counter = Counter.objects.get_or_create(name = name)[0]
counter.count += 1
counter.save()
Run Code Online (Sandbox Code Playgroud)
如果我正确理解Django,这应该将函数包装在事务中并使增量原子化.但它不起作用,并且在计数器更新中存在竞争条件.如何使这些代码成为线程安全的?
放置@Transactional注释的最佳做法是什么?我应该注释接口方法还是实现?
在使用mysql数据库的PHP脚本中,我最近需要在恰好位于另一个事务中的位置使用事务.我的所有测试似乎表明这样做很好,但我找不到任何关于这种用法的文档.
我想确定 - 事务中的事务是否在mysql中有效?如果是这样,有没有办法找出嵌套交易中有多少层次?(即恢复正常需要多少次回滚)
布莱恩,提前谢谢
我想知道实现事务的最佳方式是什么DBContext.特别是,
DbContext.SaveChanges如果我更改多个实体,是否实现事务内部?DbContext.SaveChanges多次呼叫(相同的contxet /不同的contxets),如何实现交易?entity-framework transactions entity-framework-4.1 dbcontext
transactions ×10
django ×2
python ×2
sql-server ×2
t-sql ×2
.net ×1
ado.net ×1
android ×1
animation ×1
database ×1
dbcontext ×1
interface ×1
java ×1
linq-to-sql ×1
mysql ×1
php ×1
sequelize.js ×1
spring ×1
sql ×1
transitions ×1