C #의 업무 에세이

옛날, 어떻게 흥미 진진한 반나절 운영 사항에 따라.

옛날 옛적에, 그는 이러한 거래는 의기 양양 썼다!

 

string connStr=@"Data Source=.\sqlexpress;Initial Catalog=DbTest;Integrated Security=True";
            using(SqlConnection conn=new SqlConnection(connStr))
            {
                conn.Open();
                using (SqlTransaction trans = conn.BeginTransaction())
                {
                    SqlCommand cmd = conn.CreateCommand();
                    cmd.Transaction = trans;
                    try
                    {
                        //操作1
                        cmd.CommandText = "insert into test1(id) values('aa')";
                        cmd.ExecuteNonQuery();

                        //操作2
                        cmd.CommandText = "insert into test1(id) values('01234567890')";//该句出错,id类型为varchar(10)
                        cmd.ExecuteNonQuery();

                        trans.Commit();
                        Console.WriteLine("提交!!");
                    }
                    catch(Exception e)
                    {
                        Console.WriteLine(e.Message);
                        trans.Rollback();
                        Console.WriteLine("回滚!!");
                    }
                }
                Console.ReadLine();
            }
附上只有一个字段的Test1表:
ID varchar(10) 主键

而后,又发现了Linq to Sql 这个好东西,它是一个轻量级级的ORM,功能非常强大,而且自带事务集成功能。简单的Linq参考资料

我们同样操作上面一个过程,使用Linq如下

1.新建一个 Linq to Sql 类,命名为DataClasses1.dbml,再通过‘服务器资源管理器’ 把数据库中的表添加到设计画面。

2.事务操作如下。

            DataClasses1DataContext db = new DataClasses1DataContext();

            try
            {
                //插入一条ID=1的Test1 的实体。
                db.Test1.InsertOnSubmit(new Test1() { ID = "1" });

                //插入一条超出限定长度的数据,让它报错
                db.Test1.InsertOnSubmit(new Test1() { ID = "01234567890" });

                //提交
                db.SubmitChanges();
            }
            catch { }

물론, 때문에 두 번째 오류 문 제출의 시간의 커밋, 첫 번째 문은 롤백 실패합니다. 그는 같은 간단한 작업이지만, 우리는 또한 트랜잭션을 잊지 그래서 원래 쉽게 작성할 필요가 없습니다, 모델은 더 이상 두통 ORM 없습니다. 그것을 완벽 아니라고?

 

이 명확하게 단지 Linq를 해결 할 수없는 사용하는 것입니다 경우 실제로하지, 우리가 상상할 수있는 트랜잭션은 데이터베이스 간 작업이다. 또한, Linq는 아직 성숙하지, 다른 데이터베이스의 경우, 브라우저 호환성 문제와 유사한 일관 작업을, 생산하고 있습니다. 그러나 정말 강력 Linq에, 하나님의 존재에 영향을주지 않습니다.

 

최근 트랜잭션이 TransactionScope에 클래스를 찾을 수있다, TransactionScope에 거울처럼, 당신은 단지 그를 소리 : 하나님, 나에게 트랜잭션을 부여! 당신은 정말 사업을 얻는다.

다음과 같습니다 :

 

            using (TransactionScope scope = new TransactionScope())
            { 
                //操作1,数据库1操作

                //操作2,数据库2操作

                //操作3
                scope.Complete();
            }

Scope.Complete를 들어 어떤 이상 동작 전 (), 모든 작업은 (는 어떤 데이터베이스 서버에 속하는지 여부를) 롤백됩니다.

그래서 강력한 그는해도 과언이 아니다 거울입니다!

 

 

 

HTTPS : //www.cnblogs.com/xinjian/archive/2010/07/09/1774033.html 재현

추천

출처blog.csdn.net/weixin_34209406/article/details/93822279