Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 0f1b423

Browse files
committed
Reset transaction on OrmLiteConnection once disposed
1 parent cb75369 commit 0f1b423

File tree

4 files changed

+267
-177
lines changed

4 files changed

+267
-177
lines changed

src/ServiceStack.OrmLite/Expressions/ReadConnectionExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,12 @@ public static IEnumerable<T> ExecLazy<T>(this IDbConnection dbConn, Func<IDbComm
9191

9292
public static IDbTransaction OpenTransaction(this IDbConnection dbConn)
9393
{
94-
return new OrmLiteTransaction(dbConn.BeginTransaction());
94+
return new OrmLiteTransaction(dbConn, dbConn.BeginTransaction());
9595
}
9696

9797
public static IDbTransaction OpenTransaction(this IDbConnection dbConn, IsolationLevel isolationLevel)
9898
{
99-
return new OrmLiteTransaction(dbConn.BeginTransaction(isolationLevel));
99+
return new OrmLiteTransaction(dbConn, dbConn.BeginTransaction(isolationLevel));
100100
}
101101

102102
public static IOrmLiteDialectProvider GetDialectProvider(this IDbConnection dbConn)
Lines changed: 125 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -1,126 +1,126 @@
1-
using System;
2-
using System.Data;
3-
using System.Data.Common;
4-
using System.Data.SqlClient;
5-
using ServiceStack.DataAccess;
6-
7-
namespace ServiceStack.OrmLite
8-
{
9-
/// <summary>
10-
/// Wrapper IDbConnection class to allow for connection sharing, mocking, etc.
11-
/// </summary>
12-
public class OrmLiteConnection
13-
: IDbConnection, IHasDbConnection
14-
{
15-
public readonly OrmLiteConnectionFactory Factory;
16-
public IDbTransaction Transaction { get; private set; }
17-
private IDbConnection dbConnection;
18-
private bool isOpen;
19-
20-
public OrmLiteConnection(OrmLiteConnectionFactory factory)
21-
{
22-
this.Factory = factory;
23-
}
24-
25-
public IDbConnection DbConnection
26-
{
27-
get
28-
{
29-
if (dbConnection == null)
30-
{
31-
dbConnection = Factory.ConnectionString.ToDbConnection(Factory.DialectProvider);
32-
}
33-
return dbConnection;
34-
}
35-
}
36-
37-
public void Dispose()
38-
{
39-
if (Factory.OnDispose != null) Factory.OnDispose(this);
40-
if (!Factory.AutoDisposeConnection) return;
41-
42-
DbConnection.Dispose();
43-
dbConnection = null;
44-
isOpen = false;
45-
}
46-
47-
public IDbTransaction BeginTransaction()
48-
{
49-
if (Factory.AlwaysReturnTransaction != null)
50-
return Factory.AlwaysReturnTransaction;
51-
52-
Transaction = DbConnection.BeginTransaction();
53-
return Transaction;
54-
}
55-
56-
public IDbTransaction BeginTransaction(IsolationLevel isolationLevel)
57-
{
58-
if (Factory.AlwaysReturnTransaction != null)
59-
return Factory.AlwaysReturnTransaction;
60-
61-
Transaction = DbConnection.BeginTransaction(isolationLevel);
62-
return Transaction;
63-
}
64-
65-
public void Close()
66-
{
67-
DbConnection.Close();
68-
}
69-
70-
public void ChangeDatabase(string databaseName)
71-
{
72-
DbConnection.ChangeDatabase(databaseName);
73-
}
74-
75-
public IDbCommand CreateCommand()
76-
{
77-
if (Factory.AlwaysReturnCommand != null)
78-
return Factory.AlwaysReturnCommand;
79-
80-
var cmd = DbConnection.CreateCommand();
81-
if(Transaction != null) { cmd.Transaction = Transaction; }
82-
return cmd;
83-
}
84-
85-
public void Open()
86-
{
87-
if (isOpen) return;
88-
89-
DbConnection.Open();
90-
//so the internal connection is wrapped for example by miniprofiler
91-
if(Factory.ConnectionFilter != null) { dbConnection = Factory.ConnectionFilter(dbConnection); }
92-
isOpen = true;
93-
}
94-
95-
public string ConnectionString
96-
{
97-
get { return Factory.ConnectionString; }
98-
set { Factory.ConnectionString = value; }
99-
}
100-
101-
public int ConnectionTimeout
102-
{
103-
get { return DbConnection.ConnectionTimeout; }
104-
}
105-
106-
public string Database
107-
{
108-
get { return DbConnection.Database; }
109-
}
110-
111-
public ConnectionState State
112-
{
113-
get { return DbConnection.State; }
114-
}
115-
116-
public static explicit operator SqlConnection(OrmLiteConnection dbConn)
117-
{
118-
return (SqlConnection)dbConn.DbConnection;
119-
}
120-
121-
public static explicit operator DbConnection(OrmLiteConnection dbConn)
122-
{
123-
return (DbConnection)dbConn.DbConnection;
124-
}
125-
}
1+
using System;
2+
using System.Data;
3+
using System.Data.Common;
4+
using System.Data.SqlClient;
5+
using ServiceStack.DataAccess;
6+
7+
namespace ServiceStack.OrmLite
8+
{
9+
/// <summary>
10+
/// Wrapper IDbConnection class to allow for connection sharing, mocking, etc.
11+
/// </summary>
12+
public class OrmLiteConnection
13+
: IDbConnection, IHasDbConnection
14+
{
15+
public readonly OrmLiteConnectionFactory Factory;
16+
public IDbTransaction Transaction { get; internal set; }
17+
private IDbConnection dbConnection;
18+
private bool isOpen;
19+
20+
public OrmLiteConnection(OrmLiteConnectionFactory factory)
21+
{
22+
this.Factory = factory;
23+
}
24+
25+
public IDbConnection DbConnection
26+
{
27+
get
28+
{
29+
if (dbConnection == null)
30+
{
31+
dbConnection = Factory.ConnectionString.ToDbConnection(Factory.DialectProvider);
32+
}
33+
return dbConnection;
34+
}
35+
}
36+
37+
public void Dispose()
38+
{
39+
if (Factory.OnDispose != null) Factory.OnDispose(this);
40+
if (!Factory.AutoDisposeConnection) return;
41+
42+
DbConnection.Dispose();
43+
dbConnection = null;
44+
isOpen = false;
45+
}
46+
47+
public IDbTransaction BeginTransaction()
48+
{
49+
if (Factory.AlwaysReturnTransaction != null)
50+
return Factory.AlwaysReturnTransaction;
51+
52+
Transaction = DbConnection.BeginTransaction();
53+
return Transaction;
54+
}
55+
56+
public IDbTransaction BeginTransaction(IsolationLevel isolationLevel)
57+
{
58+
if (Factory.AlwaysReturnTransaction != null)
59+
return Factory.AlwaysReturnTransaction;
60+
61+
Transaction = DbConnection.BeginTransaction(isolationLevel);
62+
return Transaction;
63+
}
64+
65+
public void Close()
66+
{
67+
DbConnection.Close();
68+
}
69+
70+
public void ChangeDatabase(string databaseName)
71+
{
72+
DbConnection.ChangeDatabase(databaseName);
73+
}
74+
75+
public IDbCommand CreateCommand()
76+
{
77+
if (Factory.AlwaysReturnCommand != null)
78+
return Factory.AlwaysReturnCommand;
79+
80+
var cmd = DbConnection.CreateCommand();
81+
if(Transaction != null) { cmd.Transaction = Transaction; }
82+
return cmd;
83+
}
84+
85+
public void Open()
86+
{
87+
if (isOpen) return;
88+
89+
DbConnection.Open();
90+
//so the internal connection is wrapped for example by miniprofiler
91+
if(Factory.ConnectionFilter != null) { dbConnection = Factory.ConnectionFilter(dbConnection); }
92+
isOpen = true;
93+
}
94+
95+
public string ConnectionString
96+
{
97+
get { return Factory.ConnectionString; }
98+
set { Factory.ConnectionString = value; }
99+
}
100+
101+
public int ConnectionTimeout
102+
{
103+
get { return DbConnection.ConnectionTimeout; }
104+
}
105+
106+
public string Database
107+
{
108+
get { return DbConnection.Database; }
109+
}
110+
111+
public ConnectionState State
112+
{
113+
get { return DbConnection.State; }
114+
}
115+
116+
public static explicit operator SqlConnection(OrmLiteConnection dbConn)
117+
{
118+
return (SqlConnection)dbConn.DbConnection;
119+
}
120+
121+
public static explicit operator DbConnection(OrmLiteConnection dbConn)
122+
{
123+
return (DbConnection)dbConn.DbConnection;
124+
}
125+
}
126126
}
Lines changed: 55 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,56 @@
1-
using System;
2-
using System.Data;
3-
4-
namespace ServiceStack.OrmLite
5-
{
6-
public class OrmLiteTransaction : IDbTransaction
7-
{
8-
private readonly IDbTransaction prevTrans;
9-
private readonly IDbTransaction trans;
10-
11-
public OrmLiteTransaction(IDbTransaction trans)
12-
{
13-
prevTrans = OrmLiteConfig.TSTransaction;
14-
OrmLiteConfig.TSTransaction = this.trans = trans;
15-
}
16-
17-
public void Dispose()
18-
{
19-
try
20-
{
21-
trans.Dispose();
22-
}
23-
finally
24-
{
25-
OrmLiteConfig.TSTransaction = prevTrans;
26-
}
27-
}
28-
29-
public void Commit()
30-
{
31-
trans.Commit();
32-
}
33-
34-
public void Rollback()
35-
{
36-
trans.Rollback();
37-
}
38-
39-
public IDbConnection Connection
40-
{
41-
get { return trans.Connection; }
42-
}
43-
44-
public IsolationLevel IsolationLevel
45-
{
46-
get { return trans.IsolationLevel; }
47-
}
48-
}
1+
using System;
2+
using System.Data;
3+
4+
namespace ServiceStack.OrmLite
5+
{
6+
public class OrmLiteTransaction : IDbTransaction
7+
{
8+
private readonly IDbTransaction prevTrans;
9+
private readonly IDbTransaction trans;
10+
private readonly IDbConnection db;
11+
12+
public OrmLiteTransaction(IDbConnection db, IDbTransaction trans)
13+
{
14+
this.db = db;
15+
prevTrans = OrmLiteConfig.TSTransaction;
16+
OrmLiteConfig.TSTransaction = this.trans = trans;
17+
}
18+
19+
public void Dispose()
20+
{
21+
try
22+
{
23+
trans.Dispose();
24+
}
25+
finally
26+
{
27+
OrmLiteConfig.TSTransaction = prevTrans;
28+
var ormLiteDbConn = this.db as OrmLiteConnection;
29+
if (ormLiteDbConn != null)
30+
{
31+
ormLiteDbConn.Transaction = prevTrans;
32+
}
33+
}
34+
}
35+
36+
public void Commit()
37+
{
38+
trans.Commit();
39+
}
40+
41+
public void Rollback()
42+
{
43+
trans.Rollback();
44+
}
45+
46+
public IDbConnection Connection
47+
{
48+
get { return trans.Connection; }
49+
}
50+
51+
public IsolationLevel IsolationLevel
52+
{
53+
get { return trans.IsolationLevel; }
54+
}
55+
}
4956
}

0 commit comments

Comments
 (0)