Browse Source

Source:DbClient 增加 SetTransaction 方法,支持设置事务。

master
王厅 2 weeks ago
parent
commit
6a0488bee7
  1. 21
      Apewer.Source/Source/DbClient.cs
  2. 11
      Apewer/Source/IDbAdo.cs

21
Apewer.Source/Source/DbClient.cs

@ -131,7 +131,7 @@ namespace Apewer.Source
{ {
if (_transaction != null) if (_transaction != null)
{ {
if (_autocommit) Commit(); if (_auto_commit) Commit();
else Rollback(); else Rollback();
_transaction = null; _transaction = null;
} }
@ -155,11 +155,18 @@ namespace Apewer.Source
const string TransactionNotFound = "事务不存在。"; const string TransactionNotFound = "事务不存在。";
private IDbTransaction _transaction = null; private IDbTransaction _transaction = null;
private bool _autocommit = false; private bool _auto_commit = false;
/// <summary>获取已启动的事务。</summary> /// <summary>获取已启动的事务。</summary>
public virtual IDbTransaction Transaction { get => _transaction; } public virtual IDbTransaction Transaction { get => _transaction; }
/// <summary>设置事务。指定为 NULL 将去除事务。</summary>
public void SetTransaction(IDbTransaction transaction, bool autoCommit = false)
{
_transaction = transaction;
_auto_commit = autoCommit;
}
string Begin(bool commit, Class<IsolationLevel> isolation) string Begin(bool commit, Class<IsolationLevel> isolation)
{ {
if (_transaction != null) if (_transaction != null)
@ -175,7 +182,7 @@ namespace Apewer.Source
try try
{ {
_transaction = isolation ? _conn.BeginTransaction(isolation.Value) : _conn.BeginTransaction(); _transaction = isolation ? _conn.BeginTransaction(isolation.Value) : _conn.BeginTransaction();
_autocommit = commit; _auto_commit = commit;
return null; return null;
} }
catch (Exception ex) catch (Exception ex)
@ -196,8 +203,8 @@ namespace Apewer.Source
/// <para>Snapshot<br />通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。 表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。</para> /// <para>Snapshot<br />通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。 表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。</para>
/// <para>Unspecified = -1<br />正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。</para> /// <para>Unspecified = -1<br />正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。</para>
/// </summary> /// </summary>
/// <param name="commit">在连接的生命周期结束时未结束事务,指定 TRUE 将自动提交,指定 FALSE 将自动回滚。</param> /// <param name="autoCommit">在连接的生命周期结束时未结束事务,指定 TRUE 将自动提交,指定 FALSE 将自动回滚。</param>
public virtual string Begin(bool commit = false) => Begin(commit, null); public virtual string Begin(bool autoCommit = false) => Begin(autoCommit, null);
/// <summary> /// <summary>
/// <para>使用指定的事务锁定行为启动事务。</para> /// <para>使用指定的事务锁定行为启动事务。</para>
@ -209,9 +216,9 @@ namespace Apewer.Source
/// <para>Snapshot<br />通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。 表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。</para> /// <para>Snapshot<br />通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。 表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。</para>
/// <para>Unspecified = -1<br />正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。</para> /// <para>Unspecified = -1<br />正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。</para>
/// </summary> /// </summary>
/// <param name="commit">在连接的生命周期结束时未结束事务,指定 TRUE 将自动提交,指定 FALSE 将自动回滚。</param> /// <param name="autoCommit">在连接的生命周期结束时未结束事务,指定 TRUE 将自动提交,指定 FALSE 将自动回滚。</param>
/// <param name="isolation">指定事务锁定行为,不指定时将使用默认值。</param> /// <param name="isolation">指定事务锁定行为,不指定时将使用默认值。</param>
public virtual string Begin(bool commit, IsolationLevel isolation) => Begin(commit, new Class<IsolationLevel>(isolation)); public virtual string Begin(IsolationLevel isolation, bool autoCommit = false) => Begin(autoCommit, new Class<IsolationLevel>(isolation));
/// <summary>提交事务。</summary> /// <summary>提交事务。</summary>
public virtual string Commit() public virtual string Commit()

11
Apewer/Source/IDbAdo.cs

@ -62,6 +62,9 @@ namespace Apewer.Source
/// <summary>获取已启动的事务。</summary> /// <summary>获取已启动的事务。</summary>
IDbTransaction Transaction { get; } IDbTransaction Transaction { get; }
/// <summary>设置事务。指定为 NULL 将去除事务。</summary>
void SetTransaction(IDbTransaction transaction, bool autoCommit = false);
/// <summary> /// <summary>
/// <para>使用默认的事务锁定行为启动事务。</para> /// <para>使用默认的事务锁定行为启动事务。</para>
/// <para>Chaos<br />无法覆盖隔离级别更高的事务中的挂起的更改。</para> /// <para>Chaos<br />无法覆盖隔离级别更高的事务中的挂起的更改。</para>
@ -72,8 +75,8 @@ namespace Apewer.Source
/// <para>Snapshot<br />通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。 表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。</para> /// <para>Snapshot<br />通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。 表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。</para>
/// <para>Unspecified = -1<br />正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。</para> /// <para>Unspecified = -1<br />正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。</para>
/// </summary> /// </summary>
/// <param name="commit">在连接的生命周期结束时未结束事务,指定 TRUE 将自动提交,指定 FALSE 将自动回滚。</param> /// <param name="autoCommit">在连接的生命周期结束时未结束事务,指定 TRUE 将自动提交,指定 FALSE 将自动回滚。</param>
string Begin(bool commit = false); string Begin(bool autoCommit = false);
/// <summary> /// <summary>
/// <para>使用指定的事务锁定行为启动事务。</para> /// <para>使用指定的事务锁定行为启动事务。</para>
@ -85,9 +88,9 @@ namespace Apewer.Source
/// <para>Snapshot<br />通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。 表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。</para> /// <para>Snapshot<br />通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。 表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。</para>
/// <para>Unspecified = -1<br />正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。</para> /// <para>Unspecified = -1<br />正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。</para>
/// </summary> /// </summary>
/// <param name="commit">在连接的生命周期结束时未结束事务,指定 TRUE 将自动提交,指定 FALSE 将自动回滚。</param> /// <param name="autoCommit">在连接的生命周期结束时未结束事务,指定 TRUE 将自动提交,指定 FALSE 将自动回滚。</param>
/// <param name="isolation">指定事务锁定行为,不指定时将使用默认值。</param> /// <param name="isolation">指定事务锁定行为,不指定时将使用默认值。</param>
string Begin(bool commit, IsolationLevel isolation); string Begin(IsolationLevel isolation, bool autoCommit = false);
/// <summary>提交事务。</summary> /// <summary>提交事务。</summary>
/// <remarks>异常常见于事务已经提交或连接已断开。</remarks> /// <remarks>异常常见于事务已经提交或连接已断开。</remarks>

Loading…
Cancel
Save