以后还是事务了

最近真的是很闲,在公司里主任大概是抱着让我学习的目的让我自学,他都不管我了,

都来一个多月了,做的东西少的可怜, 就象我以前说的那样,我其实是不怎么喜欢清闲的.

======================================================

今天在看公司以前一个系统的时候,看到其中数据访问层里有着大量的冗余代码,就自己想着

说我能不能改改, 不说减少很多,但多少减少一点,在写的时候,想到更新数据时如果出错了,怎么办?

也就想到了事务,但事务的效率又怎么样呢?会象网上说的,有一些还原点,会浪费资源,等等,都不能让人

相信,所以只能靠自己了,为此我做了一些试验,自己来验证

1    在数据库中试验

1.1  没有使用事务

代码如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
DECLARE @startTime DATETIME
SET @startTime=GETDATE()

exec('SP_InsertTest')

SELECT Eclepse_Time=DATEDIFF(MS,@startTime,GETDATE())

----------------------------------------------------------
ALTER PROCEDURE [dbo].[SP_InsertTest]
    
AS
BEGIN
    
DECLARE @i INT
    
SET @i=0

    
WHILE @i<100000
    
BEGIN

        
INSERT INTO InsertTest 
        
VALUES(@i,'abc','abc','www','123')

        
SET @i=@i+1
    
END
END

插入100000條數據用時71126ms 

插入300000條數據用時215000ms
插入500000條數據用時356190ms  

插入1000000條數據用時785453ms

 

1.2  使用事务

代码如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
ALTER PROCEDURE [dbo].[SP_InsertTest_Tran]
    
AS
BEGIN

    
BEGIN TRANSACTION

    
DECLARE @i INT
    
SET @i=0

    
WHILE @i<100000
    
BEGIN

        
INSERT INTO InsertTest 
        
VALUES(@i,'abc','abc','www','123')

        
SET @i=@i+1
    
END
    
    
COMMIT TRANSACTION

    
IF @@ERROR<>0
        
ROLLBACK TRANSACTION
    
END

测试结果如下

插入100000條數據用時36220ms  

插入300000條數據用時111826ms  

插入500000條數據用時165343ms  

插入10000000條數據用時398216ms

小结:

可以看出,时间是随着插入数据条数大致是线性的关系,并且更重要 的,使用了事务后的效率明显要比没有使用要高,

并且还不是高一点点.

2,  程序中测试

2.1 没有使用事务

代码如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
string connectString = @"data source=M204-128\SQL2005;initial catalog=RecruitDB;user id=sa;password=sa";
            
using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();

                SqlCommand command 
= new SqlCommand();
                command.Connection 
= conn;
                command.CommandType 
= CommandType.Text;

                
try
                {
                    
for (int i = 0; i < 100000; i++)
                    {
                        command.CommandText 
= "INSERT INTO InsertTest VALUES(" + i.ToString() + ",'abc','abc','www','123')";
                        command.ExecuteNonQuery();
                    }

                }
                
catch (Exception ex)
                {
                }
            }

测试结果如下:

插入100000條數據用時124765ms

插入500000條數據用時638984ms

2.2 使用事务

代码如下;

ContractedBlock.gif ExpandedBlockStart.gif Code
string connectString = @"data source=M204-128\SQL2005;initial catalog=RecruitDB;user id=sa;password=sa";
            
using (SqlConnection conn = new SqlConnection(connectString))
            {
                conn.Open();

                SqlCommand command 
= new SqlCommand();
                command.Connection 
= conn;
                command.CommandType 
= CommandType.Text;
                SqlTransaction tran 
= conn.BeginTransaction();
                command.Transaction 
= tran;

                
try
                {
                    
for (int i = 0; i < 100000; i++)
                    {
                        command.CommandText 
= "INSERT INTO InsertTest VALUES(" + i.ToString() + ",'abc','abc','www','123')";
                        command.ExecuteNonQuery();
                    }

                    tran.Commit();
                }
                
catch (Exception ex)
                {
                    
try
                    {
                        tran.Rollback();
                    }
                    
catch
                    {
                        
throw new Exception("");
                    }
                }
            }

 

测试结果如下:

插入100000條數據用時86531ms

插入500000條數據用時422562ms

小结:

这个结果并没有上面的那么样的明显,可能与我写和程序有关,但还是可以看出仍有线性关系,并且,效率还是比没有使用

事务要高.

总结:

从上面的比较中可以看出,使用事务的效率还是比不使用事务的来的好,这里没有测试写入数据发生异常时的回滚带来的

效率问题,但我不认为这是个问题,因为为什么要用数据库,数据库就是要保证数据的正确性,有事务你发生异常,可以回滚.

即使在回滚时会有时间消耗.

(C#几天没练,确实也有一点手生了)

顺便说一句,在插入大批量数据时,我有更快的方式,不用什么insert这个太慢了.

==================================================================

One day I'll be a hero

转载于:https://www.cnblogs.com/ouzi/archive/2008/12/18/1357790.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值