如果我在SQL中创建存储过程并EXEC spStoredProcedure
在BEGIN/END TRANSACTION中调用它(),那么其他存储过程是否也属于事务?
我不知道它是否像C#中的try/catches一样工作.
我正在使用以下代码一次执行两个命令.我使用sqltransaction来确保所有命令都被执行或回滚.当我运行没有"事务"的程序时它运行正常但是当我使用"事务"时它们显示错误.我的代码如下;
SqlTransaction transaction = connectionsql.BeginTransaction();
try
{
SqlCommand cmd1 = new SqlCommand("select account_name from master_account where NOT account_name = 'BANK' AND NOT account_name = 'LOAN'", connectionsql);
SqlDataReader dr1 = cmd1.ExecuteReader();
while (dr1.Read())
{
comboBox1.Items.Add(dr1[0].ToString().Trim());
}
cmd1.Dispose();
dr1.Dispose();
SqlCommand cmd2 = new SqlCommand("select items from rate",connectionsql);
SqlDataReader dr2 = cmd2.ExecuteReader();
while (dr2.Read())
{
comboBox2.Items.Add(dr2[0].ToString().Trim());
}
cmd2.Dispose();
dr2.Dispose();
transaction.Commit();
dateTimePicker4.Value = dateTimePicker3.Value;
}
catch(Exception ex)
{
transaction.Rollback();
MessageBox.Show(ex.ToString());
}
Run Code Online (Sandbox Code Playgroud)
和错误:
我正在进行一些挖掘并寻找有关SQL Server如何评估的解释MIN(Varchar)
.
我在BOL中找到了这句话:MIN在底层数据库中定义的整理顺序中找到最低值
因此,如果我有一个包含以下值的行的表:
Data
AA
AB
AC
Run Code Online (Sandbox Code Playgroud)
做一个SELECT MIN(DATA)
会返回AA.我只是想了解这背后的原因并更好地理解BOL.
谢谢!
背景
我有一些代码打开一个SQL连接,开始一个事务并在数据库上执行一些操作.此代码从DB(dequeue)创建一个对象,获取一些值并将其保存回来.整个操作需要在交易中进行.所有代码在没有事务的情况下完美运行.
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var transaction = connection.BeginTransaction();
try
{
var myObject = foo.Dequeue(connection, transaction);
var url = myObj.GetFilePathUri(connection, transaction);
//some other code that sets object values
myObj.SaveMessage(connection, transaction);
transaction.Commit(); //error here
}
catch(Exception ex)
{
transaction.Rollback();
//logging
}
finally
{
//cleanup code
}
}
Run Code Online (Sandbox Code Playgroud)
出列方法代码
public foo Dequeue(SqlConnection connection, SqlTransaction transaction)
{
using (var command = new SqlCommand(DEQUEUE_SPROC, connection) {CommandType = CommandType.StoredProcedure, Transaction = transaction})
{
var reader = command.ExecuteReader();
if (reader.HasRows)
{ …
Run Code Online (Sandbox Code Playgroud) 我正在使用最新的v6实体框架以及UnitOfWork模式.在过去的几年里,这在服务器上一直很好.
我想转移到azure托管并使用SQLAzure,因此开始迁移应用程序.但是我遇到了很多问题.
首先,我一直在间歇地得到这个错误
从服务器接收结果时发生传输级错误.
经过一些谷歌搜索,似乎这很常见,你需要实现自己的SqlAzureExecutionStrategy
- 一切似乎都很好.直到我发现它不支持发起的交易!
然后我偶然发现了这篇博文 - 其中概述了确切的问题并提供了如何解决问题的示例代码(或者我认为).
我完全按照这个帖子(据我所知).我有我的dBconfiguration类设置,它在应用程序启动时击中了SetExecutionStrategy.
public class EfConfig : DbConfiguration
{
public EfConfig()
{
SetExecutionStrategy("System.Data.SqlClient", () => SuspendExecutionStrategy
? (IDbExecutionStrategy)new DefaultExecutionStrategy()
: new CustomSqlAzureExecutionStrategy());
}
public static bool SuspendExecutionStrategy
{
get { return (bool?)CallContext.LogicalGetData("SuspendExecutionStrategy") ?? false; }
set { CallContext.LogicalSetData("SuspendExecutionStrategy", value); }
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个上面引用的自定义类,名为'CustomSqlAzureExecutionStrategy',我在下面提到并覆盖了ShouldRetryOn方法
public class CustomSqlAzureExecutionStrategy : SqlAzureExecutionStrategy
{
protected override bool ShouldRetryOn(Exception exception)
{
var shouldRetry = false;
var sqlException = exception as SqlException;
if (sqlException != null)
{
foreach …
Run Code Online (Sandbox Code Playgroud) 我们从各种数据库类型(Oracle,MySQL,SQL-Server,...)中提取数据.一旦成功写入文件,我们希望将其标记为已传输,因此我们更新特定列.
我们的问题是,用户有可能在此期间更改数据但可能忘记提交.使用select for update语句阻止记录.所以它可能发生,我们将某些东西标记为已传输,而不是.
这是我们代码的摘录:
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet extractedData = stmt.executeQuery(sql);
writeDataToFile(extractedData);
extractedData.beforeFirst();
while (extractedData.next()) {
if (!extractedData.rowUpdated()) {
extractedData.updateString("COLUMNNAME", "TRANSMITTED");
// code will stop here if user has changed data but did not commit
extractedData.updateRow();
// once committed the changed data is marked as transmitted
}
}
Run Code Online (Sandbox Code Playgroud)
该方法extractedData.rowUpdated()
返回false,因为从技术上讲,用户还没有更改任何内容.有没有办法不更新行并检测数据是否在此后期更改?
不幸的是,我无法更改用户用来更改数据的程序.
SQL Server 2005中SET XACT_ABORT语句的范围是什么?即:开始 - 结束块,过程或触发器,连接,数据库,服务器?
有没有办法在symfony2中使用实体管理器(doctrine)手动指定事务,或者可能是在单个事务中完成我自己在下面做两个事务的自然方式?
// creating screen object...
//Creating user object...
//flush the screen into database in order to get the Id to relate the server (user) to
$em->persist($screen);
$em->flush();
//Get id of just inserted screen and attach that to new server (user)
$tempRecordId = $screen->getId();
$tempEntity = $em->getRepository('BizTVContainerManagementBundle:Container')->find($tempRecordId);
$entity->setScreen($tempEntity);
//Flush the user also into database
$em->persist($entity);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
请参阅我必须刷新我的第一个实体以获取它的ID,所以我可以将我的第二个实体与我的第一个实体相关联......
我已经使用Django REST Framework从2.x版本更新了一个项目到最后一个稳定版本(3.1.3).在我的序列化程序中修复了一些已弃用的用法之后,我跑去python manage.py test
确保没有任何内容被破坏.
一切正常,除了我测试无效REST请求(我故意)的一些测试.例如:
def test_get_events_of_other_user(self):
# Assume the setUp log the user1 with self.client
# and here, there is some code initializing an
# event for user2
response = self.client.get("/event/123/")
self.assertEqual(404, response.status_code)
Run Code Online (Sandbox Code Playgroud)
视图集生成一个ORM查询MyEventModel.objects.get(user=request.user, pk=123)
,这显然会在DRF中引发404异常,因为这里不应该返回任何对象(我知道,它应该是一个符合REST的403 ...).但这提出了一个TransactionManagementError
:
Traceback (most recent call last):
[...]
File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/viewsets.py", line 85, in view
return self.dispatch(request, *args, **kwargs)
File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/views.py", line 456, in dispatch
response = self.handle_exception(exc)
File "/my_virtual_env_path/local/lib/python2.7/site-packages/rest_framework/views.py", line 421, in handle_exception
response = exception_handler(exc, …
Run Code Online (Sandbox Code Playgroud) 我是否需要在finally块中为SqlTransaction调用dispose?假装开发人员没有在任何地方使用USING,只需尝试/捕获.
SqlTransaction sqlTrans = con.BeginTransaction();
try
{
//Do Work
sqlTrans.Commit()
}
catch (Exception ex)
{
sqlTrans.Rollback();
}
finally
{
sqlTrans.Dispose();
con.Dispose();
}
Run Code Online (Sandbox Code Playgroud) sqltransaction ×10
sql-server ×4
c# ×2
transactions ×2
.net ×1
ado.net ×1
azure ×1
database ×1
dispose ×1
django ×1
doctrine ×1
java ×1
jdbc ×1
rollback ×1
scope ×1
sql ×1
symfony ×1
t-sql ×1
xact-abort ×1