.NET的事务处理(转)

  • Post author:
  • Post category:其他



1、SQL事务

优点:执行效率最佳

限制:事务上下文仅在

数据库

中调用,难以实现复杂的业务逻辑。



  1. CREATE




    PROCEDURE


    Tran1



  2. as





  3. begin


    tran



  4. set


    xact_abort


    on





  5. Insert




    Into


    trantest (id,test)


    values


    (1,


    ‘test’


    )



  6. Insert




    Into


    trantest (id,test)


    values


    (2,


    ‘test’


    )



  7. commit


    tran


  8. GO


  9. –set xact_abort on  表示遇到错误立即回滚





  10. –当然你也可以这么写





  11. CREATE




    PROCEDURE


    tran1



  12. as





  13. begin


    tran



  14. insert




    into


    trantest(id,test)


    values


    (1,


    ‘test’


    )


  15. if(@@error<>0)


  16. rollback


    tran



  17. else





  18. begin





  19. insert




    into


    trantest(id,test)


    values


    (2,


    ‘test’


    )


  20. if(@@error<>0)


  21. rollback


    tran



  22. else





  23. commit


    tran



  24. end




  25. GO


  1. CREATE




    PROCEDURE


    Tran1



  2. as





  3. begin


    tran



  4. set


    xact_abort


    on





  5. Insert




    Into


    trantest (id,test)


    values


    (1,


    ‘test’


    )



  6. Insert




    Into


    trantest (id,test)


    values


    (2,


    ‘test’


    )



  7. commit


    tran


  8. GO


  9. –set xact_abort on  表示遇到错误立即回滚





  10. –当然你也可以这么写





  11. CREATE




    PROCEDURE


    tran1



  12. as





  13. begin


    tran



  14. insert




    into


    trantest(id,test)


    values


    (1,


    ‘test’


    )


  15. if(@@error<>0)


  16. rollback


    tran



  17. else





  18. begin





  19. insert




    into


    trantest(id,test)


    values


    (2,


    ‘test’


    )


  20. if(@@error<>0)


  21. rollback


    tran



  22. else





  23. commit


    tran



  24. end




  25. GO

2、ADO.NET 事务

在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务。若要执行事务,请执行下列操作:

调用Connection 对象的BeginTransaction 方法来标记事务的开始。

将Transaction 对象分配给要执行的Command的Transaction 属性。

执行所需的命令。

调用Transaction 对象的Commit 方法来完成事务,或调用Rollback 方法来取消事务。

优点:简单,效率和数据库事务差不多快。

缺点:事务执行在数据库连接层上,所以你需要在事务过程中手动的维护一个连接。



  1. SqlConnection conn =


    new


    SqlConnection(ConfigurationManager.ConnectionStrings[


    “Test”


    ].ConnectionString);


  2. conn.Open();

  3. SqlTransaction tx = conn.BeginTransaction(IsolationLevel.ReadCommitted);

  4. SqlCommand cmd =

    new


    SqlCommand();


  5. cmd.Connection = conn;

  6. cmd.Transaction = tx;



  7. try




  8. {

  9. cmd.CommandText =

    “INSERT INTO [Test]([Name],[Value]) VALUES (‘测试1′,’1’)”


    ;


  10. cmd.ExecuteNonQuery();

  11. cmd.CommandText =

    “INSERT INTO [Test]([Name],[Value]) VALUES (‘测试2′,’2’)”


    ;


  12. cmd.ExecuteNonQuery();


  13. tx.Commit();

  14. }


  15. catch


    (Exception ex)


  16. {

  17. tx.Rollback();


  18. throw




    new


    Exception(ex.Message, ex);


  19. }


  20. finally




  21. {

  22. conn.Close();

  23. }


  1. SqlConnection conn =


    new


    SqlConnection(ConfigurationManager.ConnectionStrings[


    “Test”


    ].ConnectionString);


  2. conn.Open();

  3. SqlTransaction tx = conn.BeginTransaction(IsolationLevel.ReadCommitted);

  4. SqlCommand cmd =

    new


    SqlCommand();


  5. cmd.Connection = conn;

  6. cmd.Transaction = tx;



  7. try




  8. {

  9. cmd.CommandText =

    “INSERT INTO [Test]([Name],[Value]) VALUES (‘测试1′,’1’)”


    ;


  10. cmd.ExecuteNonQuery();

  11. cmd.CommandText =

    “INSERT INTO [Test]([Name],[Value]) VALUES (‘测试2′,’2’)”


    ;


  12. cmd.ExecuteNonQuery();


  13. tx.Commit();

  14. }


  15. catch


    (Exception ex)


  16. {

  17. tx.Rollback();


  18. throw




    new


    Exception(ex.Message, ex);


  19. }


  20. finally




  21. {

  22. conn.Close();

  23. }

3、TransactionScope事务

在.NET 2.0中新添加了一个名为System.Transactions的命名空间,其提供了一个“轻量级”的、易于使用的事务框架,通过这个框架可以大大简化事务的操作。

这个框架提供了如下优点:

(1)在简单(不涉及分布式)事务中也可以使用声明式的事务处理方法,而不必使用Com+容器和目录注册。

(2)用户根本不需要考虑是简单事务还是分布式事务。它实现一种所谓自动提升事务机制(Promotable Transaction),会自动根据事务中涉及的对象资源判断使用何种事务管理器。

TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务

优点:实现简单,同时能够自动提升为分布式事务



  1. TransactionOptions option =


    new


    TransactionOptions();


  2. option.IsolationLevel = IsolationLevel.ReadCommitted;



  3. using


    (TransactionScope ts =


    new


    TransactionScope(TransactionScopeOption.Required,option))


  4. {


  5. using


    (SqlConnection conn =


    new


    SqlConnection(ConfigurationManager.ConnectionStrings[


    “Test”


    ].ConnectionString))


  6. {

  7. conn.Open();

  8. SqlCommand cmd =

    new


    SqlCommand(conn);


  9. cmd.CommandText =

    “INSERT INTO [Test]([Name],[Value]) VALUES (‘测试1′,’1’)”


    ;


  10. cmd.ExecuteNonQuery();

  11. cmd.CommandText =

    “INSERT INTO [Test]([Name],[Value]) VALUES (‘测试2′,’2’)”


    ;


  12. cmd.ExecuteNonQuery();

  13. }

  14. ts.Complete();

  15. }


  1. TransactionOptions option =


    new


    TransactionOptions();


  2. option.IsolationLevel = IsolationLevel.ReadCommitted;



  3. using


    (TransactionScope ts =


    new


    TransactionScope(TransactionScopeOption.Required,option))


  4. {


  5. using


    (SqlConnection conn =


    new


    SqlConnection(ConfigurationManager.ConnectionStrings[


    “Test”


    ].ConnectionString))


  6. {

  7. conn.Open();

  8. SqlCommand cmd =

    new


    SqlCommand(conn);


  9. cmd.CommandText =

    “INSERT INTO [Test]([Name],[Value]) VALUES (‘测试1′,’1’)”


    ;


  10. cmd.ExecuteNonQuery();

  11. cmd.CommandText =

    “INSERT INTO [Test]([Name],[Value]) VALUES (‘测试2′,’2’)”


    ;


  12. cmd.ExecuteNonQuery();

  13. }

  14. ts.Complete();

  15. }

4、

EnterpriseServices实现事务


就是利用com+实现自动处理事务。


添加引用System.EnterpriseServices.dll

using System.EnterpriseServices;


使用方法参考:

http://support.microsoft.com/default.aspx?scid=kb;zh-cn;816141

随便建立一个按钮,在按钮中进行如下操作:




  1. try




  2. {

  3. work1();

  4. work2();

  5. ContextUtil.SetComplete();

  6. }


  7. catch


    (System.Exception except)


  8. {

  9. ContextUtil.SetAbort();

  10. Response.Write(except.Message);

  11. }


  1. try




  2. {

  3. work1();

  4. work2();

  5. ContextUtil.SetComplete();

  6. }


  7. catch


    (System.Exception except)


  8. {

  9. ContextUtil.SetAbort();

  10. Response.Write(except.Message);

  11. }


然后在页面中添加2个操作,模拟一下在逻辑层调用不同类中的操作的情况 :




  1. private void work1()


  2. {

  3. SqlConnection

    conn


    =


    new


    SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[“conn”]);


  4. SqlCommand

    cmd1


    =


    new


    SqlCommand(“Insert Into trantest (id,test)values(1,’test’)”,conn);


  5. conn.Open();

  6. cmd1.ExecuteNonQuery();

  7. conn.Close();

  8. }


  9. private void work2()

  10. {

  11. SqlConnection

    conn


    =


    new


    SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[“conn”]);


  12. SqlCommand

    cmd2


    =


    new


    SqlCommand(“Insert Into trantest (id,test)values(2,’test’)”,conn);


  13. conn.Open();

  14. cmd2.ExecuteNonQuery();

  15. conn.Close();

  16. }


  17. 修改前台页面在

    <


    %Page后面添加


    Transaction


    =


    “Required”


    即可

别人转的没有地址。。。。