当前位置: 首页 > news >正文

使用快照隔离snapshot isolation实例(二)

示例

以下示例演示修改数据时的快照隔离行为。该代码执行下列操作:

  • 连接到 AdventureWorks 示例数据库并启用 SNAPSHOT 隔离。

  • 创建一个名为 TestSnapshotUpdate 的表并插入三行示例数据。

  • 使用 SNAPSHOT 隔离开始但是不完成 sqlTransaction1。在事务中选择三行数据。

  • 创建第二个与 AdventureWorks 的 SqlConnection,并使用 READ COMMITTED 隔离级别创建第二个事务,更新在 sqlTransaction1 中选择的其中一行的值。

  • 提交 sqlTransaction2。

  • 返回 sqlTransaction1 并尝试更新 sqlTransaction2 已提交的相同的行。将引发 3960 错误,sqlTransaction1 将自动回滚。控制台窗口中将显示 SqlException.Number 和 SqlException.Message。

  • 执行清理代码以禁用 AdventureWorks 中的快照隔离并删除 TestSnapshotUpdate 表。

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace snapshot2
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = @"Data Source=XUWEI/SQLEXPRESS;Initial Catalog=AdventureWorks;User ID=sa;Password=sa12345";
            using (SqlConnection connection1 = new SqlConnection(connectionString))
            {
                connection1.Open();
                SqlCommand command1 = connection1.CreateCommand();
                // Enable Snapshot isolation in AdventureWorks,设置数据库使其支持快照隔离(Snapshot isolation)技术。
                command1.CommandText =
                    "ALTER DATABASE AdventureWorks SET ALLOW_SNAPSHOT_ISOLATION ON";
                try
                {
                    command1.ExecuteNonQuery();
                    Console.WriteLine(
                        "Snapshot Isolation turned on in AdventureWorks.");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("ALLOW_SNAPSHOT_ISOLATION ON failed: {0}", ex.Message);
                }
                // Create a table ,创建表格。
                command1.CommandText =
                    "IF EXISTS "
                    + "(SELECT * FROM sys.tables "
                    + "WHERE name=N'TestSnapshotUpdate')"
                    + " DROP TABLE TestSnapshotUpdate";
                command1.ExecuteNonQuery();
                command1.CommandText =
                    "CREATE TABLE TestSnapshotUpdate "
                    + "(ID int primary key, CharCol nvarchar(100));";
                try
                {
                    command1.ExecuteNonQuery();
                    Console.WriteLine("TestSnapshotUpdate table created.");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("CREATE TABLE failed: {0}", ex.Message);
                }
                // Insert some data,在表中创建数据。
                command1.CommandText =
                    "INSERT INTO TestSnapshotUpdate VALUES (1,N'abcdefg');"
                    + "INSERT INTO TestSnapshotUpdate VALUES (2,N'hijklmn');"
                    + "INSERT INTO TestSnapshotUpdate VALUES (3,N'opqrstuv');";
                try
                {
                    command1.ExecuteNonQuery();
                    Console.WriteLine("Data inserted TestSnapshotUpdate table.");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                // Begin, but do not complete, a transaction 
                // using the Snapshot isolation level.
                /*开始但不完成一个在快照隔离级别上的事务,
                 */
                SqlTransaction transaction1 = null;
                try
                {
                    transaction1 = connection1.BeginTransaction(IsolationLevel.Snapshot);
                    command1.CommandText =
                        "SELECT * FROM TestSnapshotUpdate WHERE ID BETWEEN 1 AND 3";
                    command1.Transaction = transaction1;
                    command1.ExecuteNonQuery();
                    Console.WriteLine("Snapshot transaction1 started.");
                    // Open a second Connection/Transaction to update data
                    // using ReadCommitted. This transaction should succeed.
                    /*打开第二个数据库连接,并创建一个在ReadCommitted上更新数据的事务。
                     * 这个事务能够成功。 
                     */
                    using (SqlConnection connection2 = new SqlConnection(connectionString))
                    {
                        connection2.Open();
                        SqlCommand command2 = connection2.CreateCommand();
                        command2.CommandText = "UPDATE TestSnapshotUpdate SET CharCol="
                            + "N'New value from Connection2' WHERE ID=1";
                        SqlTransaction transaction2 =
                            connection2.BeginTransaction(IsolationLevel.ReadCommitted);
                        command2.Transaction = transaction2;
                        try
                        {
                            command2.ExecuteNonQuery();
                            transaction2.Commit();//提交事务2
                            Console.WriteLine(
                                "transaction2 has modified data and committed.");
                        }
                        catch (SqlException ex)
                        {
                            Console.WriteLine(ex.Message);
                            transaction2.Rollback();
                        }
                        finally
                        {
                            transaction2.Dispose();
                        }
                    }
                    // Now try to update a row in Connection1/Transaction1.
                    // This transaction should fail because Transaction2
                    // succeeded in modifying the data.
                    /*试图更新连接1和事务1中的一行数据。这个事务执行失败,
                     * 这是因为在事务2中已经成功修改了数据。
                     * 事务1将自动回滚。
                     */
                    command1.CommandText =
                        "UPDATE TestSnapshotUpdate SET CharCol="
                        + "N'New value from Connection1' WHERE ID=1";
                    command1.Transaction = transaction1;
                    command1.ExecuteNonQuery();
                    transaction1.Commit();
                    Console.WriteLine("You should never see this.");//正常执行情况下应该不会再控制台中输出此句。
                }
                catch (SqlException ex)
                {
                    Console.WriteLine("Expected failure for transaction1:");
                    Console.WriteLine("  {0}: {1}", ex.Number, ex.Message);
                }
                finally
                {
                    transaction1.Dispose();
                }
            }
            // CLEANUP:清理程序
            // Turn off Snapshot isolation and delete the table
            using (SqlConnection connection3 = new SqlConnection(connectionString))
            {
                connection3.Open();
                SqlCommand command3 = connection3.CreateCommand();
                command3.CommandText =
                    "ALTER DATABASE AdventureWorks SET ALLOW_SNAPSHOT_ISOLATION OFF";
                try
                {
                    command3.ExecuteNonQuery();
                    Console.WriteLine(
                        "CLEANUP: Snapshot isolation turned off in AdventureWorks.");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("CLEANUP FAILED: {0}", ex.Message);
                }
                command3.CommandText = "DROP TABLE TestSnapshotUpdate";
                try
                {
                    command3.ExecuteNonQuery();
                    Console.WriteLine("CLEANUP: TestSnapshotUpdate table deleted.");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("CLEANUP FAILED: {0}", ex.Message);
                }
            }
        }
    }
}

 

 

转载于:https://www.cnblogs.com/xwdreamer/archive/2010/10/13/2297079.html

相关文章:

  • Powershell管理系列(十七)在PowerShell中添加Exchange管理单元
  • 数据库连接代码
  • javascript中setInterval与setTimeout中this的问题以及对于闭包的一些理解
  • 针对PostMessage和SendMessage区别的一个试验
  • 【spring框架】beans.xml规范与ClassPathXmlApplicationContext类介绍
  • It's not a Bug, It's a Feature! --POJ 1482
  • postgresql 死锁问题解决记录
  • WCF Data Services客户端访问
  • css知多少(4)——解读浏览器默认样式
  • Breakthrough—JavaScript基础
  • 辛苦几个小时,终于装完主机了
  • 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--PS2封装(十八)
  • android httpClient 支持HTTPS的2种处理方式
  • 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇阶段总结与WinForm篇展望...
  • 如何开启常用端口和其他端口
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • AWS实战 - 利用IAM对S3做访问控制
  • Elasticsearch 参考指南(升级前重新索引)
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Redis 中的布隆过滤器
  • Redis中的lru算法实现
  • Zsh 开发指南(第十四篇 文件读写)
  • 高性能JavaScript阅读简记(三)
  • 如何编写一个可升级的智能合约
  • 数组大概知多少
  • 思维导图—你不知道的JavaScript中卷
  • 再次简单明了总结flex布局,一看就懂...
  • 正则学习笔记
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 阿里云移动端播放器高级功能介绍
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #162 (Div. 2)
  • #NOIP 2014# day.1 T2 联合权值
  • #vue3 实现前端下载excel文件模板功能
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (Note)C++中的继承方式
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET Framework .NET Core与 .NET 的区别
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET MVC之AOP
  • .net 生成二级域名
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net(C#)中String.Format如何使用
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .Net8 Blazor 尝鲜
  • .Net中间语言BeforeFieldInit
  • [2018-01-08] Python强化周的第一天
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [Angular] 笔记 6:ngStyle
  • [AX]AX2012 SSRS报表Drill through action