當前位置:首頁 » 編程語言 » sql跨庫事務
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql跨庫事務

發布時間: 2022-10-02 09:17:24

『壹』 在VB中,怎樣對sql進行事務處理

事務處理是在數據處理時經常遇到的問題,經常用到的方法有以下3種總結整理如下:

方法1:直接寫入到sql中

存儲過程中使用BEGINTRANS,COMMITTRANS,ROLLBACKTRANS實現

begintrans

declare@orderDetailsErrorint,@procuntErrorint

deletefrom[orderdetails]whereproctid=42

select@orderDetailsError=@@error

deletefromproctswhereproctid=42

select@procuntError=@@error

if(@orderDetailsError=0and@procuntError=0)

COMMITTRANS

else

ROLLBACKTRANS

優點:

所有事務邏輯包含在一個單獨的調用中

擁有運行一個事務的最佳性能

獨立於應用程序

限制:

事務上下文僅存在於資料庫調用中

資料庫代碼與資料庫系統有關


方法2:使用ADO.NET實現

使用ADO.NET實現,使用這種方式的優點是可以在中間層來管理事務,當然你也可以選擇在數據層來實現。

SqlConnection和OleDbConnection對象有一個BeginTransaction方法,它可以返回SqlTransaction

或者OleDbTransaction對象。而且這個對象有Commit和Rollback方法來管理事務

SqlConnectionsqlConnection=newSqlConnection("workstationid=WEIXIAOPING;packetsize=4096;userid=sa;initialcatalog=Northwind;persistsecurityinfo=False");

sqlConnection.Open();

SqlTransactionmyTrans=sqlConnection.BeginTransaction();

SqlCommandsqlInsertCommand=newSqlCommand();

sqlInsertCommand.Connection=sqlConnection

sqlInsertCommand.Transaction=myTrans;

try{

sqlInsertCommand.CommandText="insertintotbTree(Context,ParentID)values('北京',1)";

sqlInsertCommand.ExecuteNonQuery();

sqlInsertCommand.CommandText="insertintotbTree(Context,ParentID)values('上海',1)";

sqlInsertCommand.ExecuteNonQuery();

myTrans.Commit();

}catch(Exceptionex)

{

myTrans.Rollback();

}

finally

{

sqlConnection.Close();

}

優點:

簡單性

和數據據事務差不多的快

獨立於資料庫,不同資料庫的專有代碼被隱藏了

缺點:

事務不能跨越多個資料庫連接

事務執行在資料庫連接層上,所以需要在事務過程中維護一個資料庫連接

ADO.NET分布事務也可以跨越多個資料庫,但是其中一個SQLSERVER資料庫的話,通過用SQLSERVER連接伺服器連接到別的資料庫,但是如果是在DB2和Orcal之間就不可以。

以上兩種事務是經常用到的事務處理方法。


方法3COM+事務(分布式事務)

.NETFramework依靠MTS/COM+服務來支持自動事務。COM+使用(DTC)作為事務管理器和事務協調器在分布式環境中運行事務。

這樣可使.NET應用程序運行跨多個資源結合不同操作(例如,將定單插入SQLServer資料庫、將消息寫入Microsoft消息隊列(MSMQ)隊列、以及從Oracle資料庫檢索數據)

的事務。

COM+事務處理的類必須繼承System.EnterpriseServices.ServicedComponent,其實webservice就是繼承System.EnterpriseServices.ServicedComponent,所以webservice也支持

COM+事務。

定義一個COM+事務處理的類

[Transaction(TransactionOption.Required)]

publicclassDataAccess:System.EnterpriseServices.ServicedComponent

{

}

TransactionOption枚舉類型支持5個COM+值(Disabled,NotSupported,Required,RequiresNew,Supported)

Disabled忽略當前上下文中的任何事務。

NotSupported使用非受控事務在上下文中創建組件。

Required如果事務存在則共享事務,並且如有必要則創建新事務。

RequiresNew使用新事務創建組件,而與當前上下文的狀態無關。

Supported如果事務存在,則共享該事務。

一般來說COM+中的組件需要Required或Supported。當組件用於記錄或查帳時RequiresNew很有用,因為組件應該與活動中其他事務處理的提交或回滾隔離開來。

派生類可以重載基類的任意屬性。如DataAccess選用Required,派生類仍然可以重載並指定RequiresNew或其他值。

COM+事務有手動處理和自動處理,自動處理就是在所需要自動處理的方法前加上[AutoComplete],根據方法的正常或拋出異常決定提交或回滾。

手動處理就是調用ContextUtil類中EnableCommit,SetComplete,SetAbort方法。

publicstringtestTransaction()

{

try

{

ContextUtil.EnableCommit();

InsertARecord1();

InsertARecord2();

ContextUtil.SetComplete();

return"succeed!";

}

catch(Exceptionex)

{

ContextUtil.SetAbort();

return"failed!";

}

}

publicvoidInsertARecord1()

{

stringstrconn="workstationid=WEIXIAOPING;packetsize=4096;userid=sa;initialcatalog=Northwind;persistsecurityinfo=False";

SqlConnectionconn=newSqlConnection(strconn);

conn.Open();

SqlCommandcommand=newSqlCommand("insertintotbTree(Context,ParentID)values('北京',1)",conn);

command.ExecuteNonQuery();

conn.Close();

}

publicvoidInsertARecord2()

{

stringstrconn="workstationid=WEIXIAOPING;packetsize=4096;userid=sa;initialcatalog=Northwind;persistsecurityinfo=False";

SqlConnectionconn=newSqlConnection(strconn);

conn.Open();

SqlCommandcommand=newSqlCommand("insertintotbTree(Context,ParentID)values('上海',1)",conn);

command.ExecuteNonQuery();

conn.Close();

}

在需要事務跨MSMQ和其他可識別事務的資源(例如,SQLServer資料庫)運行的系統中,只能使用DTC或COM+事務,除此之外沒有其他選擇。DTC協調參與分布式事務的所有資源管理器, 也管理與事務相關的操作。

這種做法的缺點是,由於存在DTC和COM互操作性開銷,導致性能降低。

COM+事務處理的類必須強命名。

『貳』 c# SQL跨資料庫事務問題。

資料庫建同義詞 ,可以不需要 跨資料庫 這樣插入的。
以下示例首次創建將在此後的示例中使用的同義詞。

USE tempdb;
GO
CREATE SYNONYM MyAddressType
FOR AdventureWorks.Person.AddressType;
GO
以下示例將行插入到由 MyAddressType 同義詞引用的基表。

USE tempdb;
GO
INSERT INTO MyAddressType (Name)
VALUES ('Test');
GO

『叄』 如何利用SQL Server 2012資料庫操作事務管理

一、啟用FileTable
1、修改資料庫引擎的屬性
打開「SQL Server配置管理器」,修改SQL Server資料庫引擎的屬性。使用此頁可針對此 Microsoft SQL Server 2012安裝啟用 FILESTREAM。

(1)針對 Transact-SQL 訪問啟用 FILESTREAM
選中此項可針對 Transact-SQL 訪問啟用 FILESTREAM。 必須選中此控制選項,才能使用其他控制選項。如果不啟用此選項,就不能添加FileStream文件組。
(2)針對文件 I/O 流訪問啟用 FILESTREAM
選中此項可針對 FILESTREAM 啟用 Win32 流訪問。
(3)Windows 共享名
使用此控制選項可輸入將用來存儲 FILESTREAM 數據的 Windows 共享的名稱。默認為該SQL Server實例的名稱。
(4)允許遠程客戶端針對 FILESTREAM 數據啟用流訪問
選中此控制選項可允許遠程客戶端訪問此伺服器上的此 FILESTREAM 數據。

2、修改伺服器的屬性
打開「SQL Server Management Studio」,修改該實例的配置。默認配置如下:

上述選項解釋如下:
(1)「FILESTREAM 訪問級別」顯示 SQL Server 實例上支持的 FILESTREAM 的當前級別。若要更改訪問級別,請選擇以下值之一:
已禁用
無法將二進制大型對象 (BLOB) 數據存儲在文件系統中。此為默認值。即filestream access level=0
已啟用 Transact-SQL 訪問
可使用 Transact-SQL 訪問 FILESTREAM 數據,但不能通過文件系統進行訪問。即filestream access level=1
已啟用完全訪問
FILESTREAM 數據可使用 Transact-SQL 以及通過文件系統進行訪問。即filestream access level=0
注意:在首次啟用 FILESTREAM 時,您可能需要重新啟動計算機才能配置驅動程序。
(2)「FILESTREAM 共享名稱」顯示在安裝過程中選擇的 FILESTREAM 共享的只讀名稱。

在本次實驗中,我們將「FILESTREAM 訪問級別」 設定為:已啟用完全訪問。
如果是通過T-SQL腳本執行,則運行以下腳本:
EXEC sys.sp_configure N'filestream access level', N'2'
RECONFIGURE WITH OVERRIDE

注意:設置完成之後,重啟實例。

3、配置防火牆
若要在防火牆保護的環境中使用 FILESTREAM,客戶端和伺服器都必須能夠將 DNS 名稱解析為包含 FILESTREAM 文件的伺服器。FILESTREAM 要求 Windows 文件共享埠 139 和 445 處於打開狀態。

二、配置文件組
1、添加文件組
完成上述操作之後,就可以為該資料庫添加專用於FileStream的文件組。

如果是通過腳本操作,請運行以下腳本:
ALTER DATABASE [db01] ADD FILEGROUP [FileStreamFileGroup] CONTAINS FILESTREAM

2、添加文件
完成上述操作之後,就可以為該資料庫添加FilStream類型的資料庫文件。

在本例中,系統並沒有為「FileStream數據」的文件類型創建mdf或ndf文件,而是在文件夾C:\SqlData下面自動創建以邏輯名稱命名的文件夾,即 C:\SqlData\FileData。其中filestream.hdr 文件是 FILESTREAM 容器的頭文件。當這個資料庫被刪除時,mdf、ndf、log連同這個文件夾都會被刪除。

如果是通過腳本操作,請運行以下腳本:
ALTER DATABASE [db01] ADD FILE ( NAME = N'FileData', FILENAME = N'C:\SqlData\FileData' ) TO FILEGROUP [FileStreamFileGroup]
注意:在上例中,在運行腳本之前,必須存在C:\SqlData,建議使用右側的選擇按鈕選擇路徑。如果路徑不存在,就會報錯:

同時不能存在重復的文件夾,即不能存在C:\SqlData\FileData。否則也會報錯:


3、啟動非事務訪問
FileTable 使 Windows 應用程序可以獲取 FILESTREAM 數據的 Windows 文件句柄而不需要 SQL Server 事務。為了允許對 SQL Server 中存儲的文件進行此非事務性訪問,必須為要包含 FileTable 的每個資料庫在資料庫級別上指定所需的非事務性訪問級別。

選項解釋如下:
(1)FILESTREAM 非事務訪問
為從文件系統到 FileTables 中存儲的 FILESTREAM 數據的非事務性訪問指定以下選項之一:OFF、READ_ONLY 或 FULL。
如果在伺服器上未啟用 FILESTREAM,則該值將設置為 OFF 並且被禁用。在本次實驗中,將其設置為FULL。
(2)FILESTREAM 目錄名稱
為與所選資料庫相關聯的 FILESTREAM 數據指定目錄名稱。在 FileTable 文件夾層次結構中,此資料庫級目錄將成為在實例級別為 FILESTREAM 指定的共享名稱的子級以及在資料庫中創建的 FileTable 的父級。
如果啟用非事務性訪問時沒有提供目錄名稱,則在以後必須提供它,這樣才能在資料庫中創建 FileTable。

如果是通過腳本執行,如下:
ALTER DATABASE db01
SET FILESTREAM ( NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'ImageFiles' )
注意:更改現有資料庫時,調用帶 DIRECTORY_NAME FILESTREAM 選項的 ALTER DATABASE (Transact-SQL) 語句。使用這些選項更改目錄名稱時,資料庫必須以獨占方式鎖定,沒有打開的文件句柄。

說明:為檢查是否在資料庫上啟用了非事務性訪問,可以查詢目錄視圖,腳本如下:
SELECT DB_NAME(database_id), non_transacted_access, non_transacted_access_desc
FROM sys.database_filestream_options

三、創建FileTable
1、創建第一個FileTable
「SQL Server Management Studio」只提供一個腳本模板,要想創建FileTable還是得用腳本完成:
USE db01
CREATE TABLE ImageTable1 AS FILETABLE
官方的範本為:
USE [db01]
CREATE TABLE [dbo].[ImageTable1] AS FILETABLE ON [PRIMARY] FILESTREAM_ON [FileStreamFileGroup]
WITH
(FILETABLE_DIRECTORY = N'ImageTable1', FILETABLE_COLLATE_FILENAME = Chinese_PRC_CI_AS)

2、創建第二個FileTable
CREATE TABLE ImageTable2 AS FILETABLE

3、獲取共享路徑
文件表創建之後,就會相應的產生一個文件表共享目錄,該目錄路徑可以通過內建函數獲取:
SELECT FileTableRootPath('ImageTable1')
本次實驗所返回的結果為:\\SQL1\SqlFile\ImageFiles\ImageTable1

4、查看
通過Windows資源管理器,可見已經創建了以GUID命名的文件夾。

通過SQL Server Management Studio,查看錶的結構。


四、操作
1、向文件夾中添加文件
通過 「Windows資源管理器」,向文件夾\\SQL1\SqlFile\ImageFiles\ImageTable1中添加一個文件A01.GIF。然後運行腳本:
select * from ImageTable1
結果如下:

可見, SQL Server自動在Table中添加了記錄。

2、文件改名
運行以下腳本:
update ImageTable1 set name='Cup.GIF' where name='A01.GIF'
通過「Windows資源管理器」,查看文件夾\\SQL1\SqlFile\ImageFiles\ImageTable1,可見文件A01.GIF已經被改名為Cup.GIF 。

3、查看共享文件夾
我們可以繼續復制其他文件,然後通過「Windows資源管理器」,查看文件夾。


4、刪除文件
可以使用腳本刪除,例如:
Delete ImageTable1 where name='Cup.GIF'
或者,通過「Windows資源管理器」直接刪除該文件。

五、備份和還原

1、備份資料庫
使用 SQL Server 備份資料庫時,FILESTREAM 數據將與資料庫中的結構化數據一起備份。


2、部分備份
如果不想將 FILESTREAM 數據與關系數據一起備份,則可以使用部分備份將 FILESTREAM 文件組排除在外。

『肆』 SQL事務概念是什麼,舉個例子說明什麼樣的東西是事務,與程序又有何區別,

資料庫事務是構成單一邏輯工作單元的操作集合。

舉例:轉賬是生活中常見的操作,比如從A賬戶轉賬100元到B賬號。站在用戶角度而言,這是一個邏輯上的單一操作,然而在資料庫系統中,至少會分成兩個步驟來完成:

1、將A賬戶的金額減少100元

2、將B賬戶的金額增加100元。

與程序的區別:一個程序中包含多個事務。在關系資料庫中,一個事務可以是一條SQL語句,一組SQL語句或整個程序。

(4)sql跨庫事務擴展閱讀:

事務必須具備四個屬性,簡稱ACID屬性:

1、原子性(Atomicity):事務是一個完整的操作。事務的各步操作是不可分的(原子的);要麼都執行,要麼都不執行。

2、一致性(Consistency):當事務完成時,數據必須處於一致狀態。

3、隔離性(Isolation):對數據進行修改的所有並發事務是彼此隔離的,這表明事務必須是獨立的,它不應以任何方式依賴於或影響其他事務。

4、永久性(Durability):事務完成後,它對資料庫的修改被永久保持,事務日誌能夠保持事務的永久性。

『伍』 C#如何進行跨伺服器的SQL SERVER的多事務處理只要一處出錯能回滾全部事務...

第一,兩個事物都開啟。
第二,將第一個庫查詢的數據放入數據表中,帶入一個方法中(此方法用戶將查詢到的數據插入第二個庫,另外還有第二個事物也作為參數傳進來)
第三,刪除第一個庫中的數據。
第四,提交兩個事物
如果有錯,兩個事物回滾。

『陸』 mssql如何將一個資料庫中的表同步到另一個資料庫中 做成事務

1 在另一個資料庫中建立同樣結構的副表,導入相同的數據
2 在本地資料庫建立另一個資料庫的相應鏈接
3 在本地資料庫主表建立插入修改刪除觸發器,主表有什麼變化直接寫入到副表中
4當然這種方法也不是特別好,會影響本地資料庫主表的性能。

『柒』 jdbc如何實現資料庫跨庫事務刪除回滾的問題

1. Connection.setAutoCommit(boolean );//設置自動提交模式,false表示禁用自動提交模式;
2. 用Savepoint對象的setSavapoint(String name);
3 rollback()取消在當前事務中進行的所有更改;
4. rollback (Savepoint )//回退到保存點 狀態;
5. commit ()提交事務;

『捌』 mysql怎麼給操作兩個資料庫的sql加事務

mysql一般表使用innodb引擎才能使用事務,請先確定表引擎為innodb