SQL Server 分布式事务与本地事务

SQL Server 分布式事务与本地事务

@(SQL Server)

背景:之前有项目中出现大量死锁,进行排查后最终发现很多死锁都是由于序列化隔离级别导致,开发针对业务和SQL进行优化后,死锁减少,但是没进行后续研究。最近又有很多项目出现死锁及超时,特别是工作流和待办这块,同样发现都是存在序列化,于是针对这一点进行相关资料查阅及解答。

一. 为什么会出现serializable(序列化)

如果我们程序中定义事务类调用了分布式事务,那么事务的隔离级别默认就是serializable,数据库中即会出现序列化级别的会话。

而如果调用了本地事务,那么隔离级别默认为Read committed

二. 分布式事务与本地事务的区别

本地事务System.Data.Common.DbTransaction,只能进行本地事务操作,无法建立多个数据库连接跨实例操作。

分布式事务System.Transactions.TransactionScope,同一个事务中,可以建立多个数据库连接,进行跨库或跨实例操作,需要开启msdtc服务。

分布式事务的常见使用场景有如下几种:

  1. TransactionScope中有多个SqlConnection(多个数据库连接)连接同一个SqlServer实例的不同数据库
  2. TransactionScope中的多个SqlConnection(多个数据库连接)连接不同的SqlServer实例
  3. TransactionScope中有SqlConnection(数据库连接)执行的Sql语句使用到了LinkedServer(链接服务器)

参看上面分布式事务的使用场景,我们应用中除了个性化会使用到这些场景,其他大部分事务其实都不需要调用分布式事务,所以一般情况下我们的数据库中不会出现序列化隔离级别。

三. 2种事务隔离级别区别

Read committedSerializable 分别是本地事务与分布式事务的默认隔离级别,2种隔离级别的区别在于,SQL执行过程中锁的范围不同。

通俗来说,Serializable级别下,锁的范围更大,所以会导致阻塞变多,进而死锁发生概率变高。但是Serializable级别下数据一致性最高,也就是说可以避免不可重复读、幻读等。

对于我们应用来说,不可重复读或者幻读的影响几乎没有,所以不用刻意去规避这些问题,使用默认的Read committed 来防止脏读就可以,所以除非场景符合分布式事务,一般使用本地事务即可。

四. 总结建议

对于使用分布式事务,可能之前开发并没有注意到它的使用场景及事务隔离级别,许多事务并不需要分布式事务,仅仅本地事务就可以满足,而那些需要分布式的场景,在使用的时候也可以修改其默认的隔离级别因为序列化隔离级别的优势我们并不需要,相反其并发性差的弱势却是我们需要避免的

修改分布式事务隔离级别代码:

TransactionOptions transactionOption = new TransactionOptions();
transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; //设置隔离级别
using (TransactionScope scope = new TransactionScope(transactionOption)) {
}  //然后这儿加上transactionOption参数

查看数据库中是否存在序列化会话

select * from sys.dm_exec_sessions where transaction_isolation_level = 4

附录

https://www.cnblogs.com/xcj26/archive/2013/12/23/3469373.html

http://www.360doc.com/content/14/1016/10/19715875_417357952.shtml

https://technet.microsoft.com/zh-cn/library/ms177403(v=sql.105).aspx

https://www.bbsmax.com/A/x9J2llEd6o/

https://www.bbsmax.com/A/RnJWrAPrzq/

https://msdn.microsoft.com/zh-cn/library/system.transactions.transactionscope

原文地址:https://www.cnblogs.com/xuty/p/8376064.html

时间: 2024-10-08 21:42:55

SQL Server 分布式事务与本地事务的相关文章

SQL Server 复制(Replication) ——事务复制搭建

本文演示如何搭建最基本的事务复制. 环境准备: 虚拟机2台: 服务器名分别为RepA和RepB,RepA为发布服务器,RepB为订阅服务器.均安装WindowsServer 2008R2英文版(在外企工作的原因).并确保两台服务器能互访. SQL Server: 在上面的虚拟机中分别安装SQLServer 2008 R2 x64 英文企业版. 演示数据库: 微软示例数据库AdventureWorks2008 R2 配置事务复制 复制的配置可以使用T-SQL来实现,但是所需的T-SQL及存储过程加

SQL Server 中的6个事务隔离级别简介

本文出处:http://www.cnblogs.com/wy123/p/7218316.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 数据库中的事物是具有原子性(Atomicity),一致性(Consistemcy),隔离性(Isolation),持久性(Durability)四个特征.在上述四个特性中的一致性和隔离性的实现中,是通过锁来实现对相同数据的访问隔离的.事物的隔离级别又可以影响锁的申请和时间的

SQL SERVER完整、差异和事务日志备份及还原(脚本和GUI实现) [原创]

一.完整备份.差异备份和事务日志备份的脚本 --完整备份数据库 BACKUP DATABASE Test_Bak TO DISK = 'E:\20150609_75\bak\Test_bak_full.bak' WITH INIT --差异备份数据库 BACKUP DATABASE Test_Bak TO DISK = 'E:\20150609_75\bak\Test_bak_diff.bak' WITH INIT, DIFFERENTIAL --加上DIFFERENTIAL代表差异备份 --事

SQL Server分布式数据库技术(LinkedServer,CT,SSB)

SQL Server自定义业务功能的数据同步 在不同业务需求的驱动下,数据库的模块化拆分将会面临一些比较特殊的业务逻辑处理需求.例如,在数据库层面的数据同步需求.同步过程中,可能会有一些比较复杂的业务逻辑判断.简单介绍几个SQL Server提供的数据同步功能. 已链接服务(Linked Server) 通过链接数据库可以实现不同实例间数据的访问和更新操作.通常会与OPENQUERY行集函数一起使用,以避免分布式事务的干涉.不建议直接使用已链接服务来做远程数据的更新操作,因为这需要使用到分布式数

SQL Server 分布式数据库性能测试

我使用三台SQL Server 2012 搭建分布式数据库,将一年的1.4亿条数据大致均匀存储在这三台Server中,每台Server 存储4个月的数据,Physical Server的配置基本相同,内存16G,双核 CPU 3.6GHz. 1,创建的分区视图,Linked Server的Alias是db2 和 db3,Catalog 是 tdw(test data warehouse). CREATE TABLE [dbo].[Commits] ( [CommitID] [bigint] ID

SQL Server 无法连接到本地服务器

未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接: 解决办法: 在服务中启动SQL Server (MSSQLSERVER)这个服务.

SQL Server 查看正在运行的事务信息的 2 种方法。

方法 1.sys.dm_tran_session_transactions; 方法 2.dbcc opentran ------------------------------------------------------------------------------------------------------------------------------------------------------------ 方法 1. sys.dm_tran_session_transacti

win7(64位)Sql server 用T-sql读取本地数据文件dbf的数据文件

原文地址:https://www.cnblogs.com/cl1006/p/9924066.html 第一步启用Ad Hoc Distributed Queries  在SQLserver执行以下的语句: exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure ----允许在进程中使用ACE.OLEDB.12   在安装

本地事务和分布式事务工作实践 【转】

一:从事务的历史说起 知已知彼,百战不败.想了解事务,我们从事务的历史说起. 在Windows平台上,事务的概念最开始出现在关系型数据库中,但是随着.net平台的发展,事务包括的的范围也越来越宽,先一睹为快, 在关系型数据库中的事务是通过begin transaction,rollback transaction, commit 等关键字来实现事务的. BEGIN TRANSACTION  UPDATE [dbo].[T_ACCOUNT] SET BALANCE = BALANCE + @amo