1、C#如何進行跨伺服器的SQL SERVER的多事務處理?只要一處出錯能回滾全部事務...
先執行插入,插入後在執行刪除。
2、sip 有狀態事務和無狀態伺服器什麼區別
無狀態是指協議對於事務處理沒有記憶能力.缺少狀態意味著如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大.另一方面,在伺服器不需要先前信息時它的應答就較快.
客戶端與伺服器進行動態交互的Web應用程序出現之後,HTTP無狀態的特性嚴重阻礙了這些應用程序的實現,畢竟交互是需要承前啟後的,簡單的購物車程序也要知道用戶到底在之前選擇了什麼商品.
3、如何實現跨伺服器的事務操作
--不同伺服器資料庫之間的數據操作
--************************************************************************************
1、--創建鏈接伺服器
exec sp_addlinkedserver 'ITSV', ' ', 'SQLOLEDB', '遠程伺服器名或ip地址 '
exec sp_addlinkedsrvlogin 'ITSV', 'false ',null, '用戶名', '密碼'
2、啟動兩台伺服器的MSDTC服務
MSDTC服務提供分布式事務服務,如果要在資料庫中使用分布式事務,必須在參與的雙方伺服器啟動MSDTC(Distributed Transaction Coordinator)服務。
3、打開雙方的135埠
MSDTC服務依賴於RPC(Remote Procere Call (RPC))服務,RPC使用135埠,保證RPC服務啟動,如果伺服器有防火牆,保證135埠不被防火牆擋住。
使用「telnet IP 135」命令測試對方埠是否對外開放。也可用埠掃描軟體(比如Advanced Port Scanner)掃描埠以判斷埠是否開放
4、--如要創建觸發器
create trigger t_test on test
for insert,update,delete
as
--加上下面兩句,否則會提示新事務不能登記到指定事務處理器
set xact_abort on
begin distributed tran
delete from openrowset('sqloledb','xz';'sa';'',test.dbo.test)
where id in(select id from deleted)
insert into openrowset('sqloledb','xz';'sa';'',test.dbo.test)
select * from inserted
commit tran
--查詢示例
select * from ITSV.資料庫名.dbo.表名
--導入示例
select * into 表 from ITSV.資料庫名.dbo.表名
--以後不再使用時刪除鏈接伺服器
exec sp_dropserver 'ITSV ', 'droplogins '
4、java在交易過程伺服器掛掉怎麼回滾
java中交易操作可以在service層做事務,要提交一起提交,或者都不提交,如果伺服器掛掉,那就是沒有提交成功,不會有影響,都不操作就相當於回滾
5、利用事務一次提交大量插入操作會撐爆資料庫伺服器內存嗎
向資料庫中插入一條數據 不一定都會建立一次資料庫連接 開啟一個事務。
資料庫的連接是可以保持的。一旦連接,那麼可以向伺服器進行多次數據傳輸或執行命令。
向資料庫伺服器提交一次數據,會開戶一個隱含的事務。
但是,「資料庫」這個概念在使用時,不僅僅是資料庫伺服器,還包含客戶端,對於客戶端來說,有可能是會緩存一部分數據的。數據的操作可能會向緩存操作,這種情況下不會主動開戶事務。
6、利用事務一次提交大量插入操作會撐爆資料庫伺服器內存嗎?
不知道是什來么資料庫,oracle的話源建議:
只需設置足夠大的undo表空間,所謂足夠大:insert操作要大於數據大小的一倍;update,delete操作要大於數據大小的兩倍。當然你要兼顧其他操作的消耗。
提交數量可以認為與內存消耗沒什麼關系。
如你所述,如果分批的話,會涉及的整個事物的完整性,這和業務邏輯相關,
使用oracle的話,既然這需要是一個事務來提交,既沒必要在分批。而且也不建議去故意分批進行操作。
不分批你唯一要承擔的就是分批足夠的undo空間。
7、下面的(事務失敗。 伺服器響應為:)這一段話,講的是什麼意思?
這個錯誤就是短時間內發了大量的郵件,版導致的錯誤權。
http://www.jc-pro.com/news_155.html
8、兩個在不同主機的資料庫伺服器,如何支持事務
1、首先使用鏈接伺服器,在一台伺服器上鏈接另外一台伺服器
2、啟用事務
3、在事務內,分別操作兩台伺服器的表數據
4、遇錯回滾事務,或最後提交事務
以上4步即可實現在不同主機的資料庫伺服器支持事務
9、執行如下事務,在該事務運行結束前關閉服務,查看錶是否進行了修改,為什麼
安全地關閉MySQL實例
關閉過程:
1、發起shutdown,發出 SIGTERM信號
2、有必要的話,新建一個關閉線程(shutdown
thread)
如果是客戶端發起的關閉,則會新建一個專用的關閉線程
如果是直接收到 SIGTERM 信號進行關閉的話,專門負責信號處理的線程就會負責關閉工作,或者新建一個獨立的線程負責這個事
當無法創建獨立的關閉線程時(例如內存不足),MySQL Server會發出類似下面的告警信息:
?
1Error: Can't create thread to kill server
3、MySQL Server不再響應新的連接請求
關閉TCP/IP網路監聽,關閉Unix Socket等渠道
4、逐漸關閉當前的連接、事務
空閑連接,將立刻被終止;
當前還有事務、SQL活動的連接,會將其標識為 killed,並定期檢查其狀態,以便下次檢查時將其關閉;(參考 KILL 語法)
當前有活躍事務的,該事物會被回滾,如果該事務中還修改了非事務表,則已經修改的數據無法回滾,可能只會完成部分變更;
如果是Master/Slave復制場景里的Master,則對復制線程的處理過程和普通線程也是一樣的;
如果是Master/Slave復制場景里的Slave,則會依次關閉IO、SQL線程,如果這2個線程當前是活躍的,則也會加上 killed
標識,然後再關閉;
Slave伺服器上,SQL線程是允許直接停止當前的SQL操作的(為了避免復制問題),然後再關閉該線程;
在MySQl
5.0.80及以前的版本里,如果SQL線程當時正好執行一個事務到中間,該事務會回滾;從5.0.81開始,則會等待所有的操作結束,除非用戶發起KILL操作。
當Slave的SQL線程對非事務表執行操作時被強制 KILL了,可能會導致Master、Slave數據不一致;
5、MySQL Server進程關閉所有線程,關閉所有存儲引擎;
刷新所有表cache,關閉所有打開的表;
每個存儲引擎各自負責相關的關閉操作,例如MyISAM會刷新所有等待寫入的操作;InnoDB會將buffer pool刷新到磁碟中(從MySQL
5.0.5開始,如果innodb_fast_shutdown不設置為 2 的話),把當前的LSN記錄到表空間中,然後關閉所有的內部線程。
6、MySQL Server進程退出
關於KILL指令
從5.0開始,KILL 支持指定 CONNECTION | QUERY兩種可選項:
KILL CONNECTION和原來的一樣,停止回滾事務,關閉該線程連接,釋放相關資源;
KILL
QUERY則只停止線程當前提交執行的操作,其他的保持不變;
提交KILL操作後,該線程上會設置一個特殊的
kill標記位。通常需要一段時間後才能真正關閉線程,因為kill標記位只在特定的情況下才檢查:
1、執行SELECT查詢時,在ORDER BY或GROUP BY循環中,每次讀完一些行記錄塊後會檢查
kill標記位,如果發現存在,該語句會終止;
2、執行ALTER TABLE時,在從原始表中每讀取一些行記錄塊後會檢查 kill
標記位,如果發現存在,該語句會終止,刪除臨時表;
3、執行UPDATE和DELETE時,每讀取一些行記錄塊並且更新或刪除後會檢查 kill
標記位,如果發現存在,該語句會終止,回滾事務,若是在非事務表上的操作,則已發生變更的數據不會回滾;
4、GET_LOCK()
函數返回NULL;
5、INSERT
DELAY線程會迅速內存中的新增記錄,然後終止;
6、如果當前線程持有表級鎖,則會釋放,並終止;
7、如果線程的寫操作調用在等待釋放磁碟空間,則會直接拋出「磁碟空間滿」錯誤,然後終止;
8、當MyISAM表在執行REPAIR
TABLE 或 OPTIMIZE TABLE 時被 KILL的話,會導致該表損壞不可用,指導再次修復完成。
安全關閉MySQL幾點建議
想要安全關閉 mysqld 服務進程,建議按照下面的步驟來進行:
0、用具有SUPER、ALL等最高許可權的賬號連接MySQL,最好是用 unix socket
方式連接;
1、在5.0及以上版本,設置innodb_fast_shutdown = 1,允許快速關閉InnoDB(不進行full
purge、insert buffer
merge),如果是為了升級或者降級MySQL版本,則不要設置;
2、設置innodb_max_dirty_pages_pct =
0,讓InnoDB把所有臟頁都刷新到磁碟中去;
3、設置max_connections和max_user_connections為1,也就最後除了自己當前的連接外,不允許再有新的連接創建;
4、關閉所有不活躍的線程,也就是狀態為Sleep
且 Time 大於 1 的線程ID;
5、執行 SHOW PROCESSLIST
確認是否還有活躍的線程,尤其是會產生表鎖的線程,例如有大數據集的SELECT,或者大范圍的UPDATE,或者執行DDL,都是要特別謹慎的;
6、執行
SHOW ENGINE INNODB STATUS 確認History list
length的值較低(一般要低於500),也就是未PURGE的事務很少,並且確認Log sequence number、Log flushed up
to、Last checkpoint at三個狀態的值一樣,也就是所有的LSN都已經做過檢查點了;
7、然後執行FLUSH LOCKAL TABLES
操作,刷新所有 table cache,關閉已打開的表(LOCAL的作用是該操作不記錄BINLOG);
8、如果是SLAVE伺服器,最好是先關閉
IO_THREAD,等待所有RELAY LOG都應用完後,再關閉 SQL_THREAD,避免 SQL_THREAD
在執行大事務被終止,耐心待其全部應用完畢,如果非要強制關閉的話,最好也等待大事務結束後再關閉SQL_THREAD;
9、最後再執行 mysqladmin
shutdown。
10、緊急情況下,可以設置innodb_fast_shutdown = 1,然後直接執行 mysqladmin shutdown
即可,甚至直接在操作系統層調用 kill 或者 kill -9 殺掉 mysqld 進程(在innodb_flush_log_at_trx_commit = 0
的時候可能會丟失部分事務),不過mysqld進程再次啟動時,會進行CRASH RECOVERY工作,需要有所權衡。
10、Spring配置了事物,如果用戶操作時斷網了,伺服器會回滾嗎
1、如果是用戶端斷網,那是提交不上去的。
2、如果是伺服器斷網了,提交前斷網的話 也是不會處理,服務端接收數據後斷網的話 依然會處理,事務任然起作用。