當前位置:首頁 » 數據倉庫 » 不同資料庫事務
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

不同資料庫事務

發布時間: 2022-09-09 23:15:00

Ⅰ hibernate中如何利用事務操作兩種不同的資料庫

用好事務回滾,加錢和減錢要同時成功,這個事情才算是正確被完成。try{tran.begin;business ;//加減錢tran.commit;}catch(Excetion e){tran.rollback;}

Ⅱ 資料庫的事務機制是什麼

回答的有點多請耐心看完。
希望能幫助你還請及時採納謝謝
1事務的原理
事務就是將一組sql語句放在同一批次內去執行,如果一個SQL語句出錯,則該批次內的所有SQL都將被取消執行。MySQL事務處理只支持InnoDB和BDB數據表類型。

1事務的ACID原則
** 1(Atomicity)原子性**: 事務是最小的執行單位,不允許分割。原子性確保動作要麼全部完成,要麼完全不起作用;
2(Consistency)一致性: 執行事務前後,數據保持一致;
3(Isolation)隔離性: 並發訪問資料庫時,一個事務不被其他事務所干擾。
4(Durability)持久性: 一個事務被提交之後。對資料庫中數據的改變是持久的,即使資料庫發生故障。

1緩沖池(Buffer Pool)
Buffer Pool中包含了磁碟中部分數據頁的映射。當從資料庫讀取數據時,會先從Buffer Pool中讀取數據,如果Buffer Pool中沒有,則從磁碟讀取後放入到Buffer Pool中。當向資料庫寫入數據時,會先寫入到Buffer Pool中,Buffer Pool中更新的數據會定期刷新到磁碟中(此過程稱為刷臟)。

2日誌緩沖區(Log Buffer)
當在MySQL中對InnoDB表進行更改時,這些更改命令首先存儲在InnoDB日誌緩沖區(Log Buffer)的內存中,然後寫入通常稱為重做日誌(redo logs)的InnoDB日誌文件中。

3雙寫機制緩存(DoubleWrite Buffer)
Doublewrite Buffer是共享表空間的物理文件的 buffer,其大小是2MB.是一個一分為二的2MB空間。
刷臟操作開始之時,先進行臟頁**『備份』**操作.將臟頁數據寫入 Doublewrite Buffer.
將Doublewrite Buffer(順序IO)寫入磁碟文件中(共享表空間) 進行刷臟操作.

4回滾日誌(Undo Log)
Undo Log記錄的是邏輯日誌.記錄的是事務過程中每條數據的變化版本和情況.
在Innodb 磁碟架構中Undo Log 默認是共享表空間的物理文件的Buffer.
在事務異常中斷,或者主動(Rollback)回滾的過程中 ,Innodb基於 Undo Log進行數據撤銷回滾,保證數據回歸至事務開始狀態.

5重做日誌(Redo Log)
Redo Log通常指的是物理日誌,記錄的是數據頁的物理修改.並不記錄行記錄情況。(也就是只記錄要做哪些修改,並不記錄修改的完成情況) 當資料庫宕機重啟的時候,會將重做日誌中的內容恢復到資料庫中。

1原子性
Innodb事務的原子性保證,包含事務的提交機制和事務的回滾機制.在Innodb引擎中事務的回滾機制是依託 回滾日誌(Undo Log) 進行回滾數據,保證數據回歸至事務開始狀態.

2那麼不同的隔離級別,隔離性是如何實現的,為什麼不同事物間能夠互不幹擾? 答案是 鎖 和 MVCC。
3持久性
基於事務的提交機制流程有可能出現三種場景.
1 數據刷臟正常.一切正常提交,Redo Log 循環記錄.數據成功落盤.持久性得以保證

2數據刷臟的過程中出現的系統意外導致頁斷裂現象 (部分刷臟成功),針對頁斷裂情況,採用Double write機制進行保證頁斷裂數據的恢復.

3數據未出現頁斷裂現象,也沒有刷臟成功,MySQL通過Redo Log 進行數據的持久化即可

4一致性
從資料庫層面,資料庫通過原子性、隔離性、持久性來保證一致性

2事務的隔離級別
Mysql 默認採用的 REPEATABLE_READ隔離級別 Oracle 默認採用的 READ_COMMITTED隔離級別

臟讀: 指一個事務讀取了另外一個事務未提交的數據。
不可重復讀: 在一個事務內讀取表中的某一行數據,多次讀取結果不同
虛讀(幻讀): 是指在一個事務內讀取到了別的事務插入的數據,導致前後讀取不一致。

2基本語法
-- 使用set語句來改變自動提交模式
SET autocommit = 0; /*關閉*/
SET autocommit = 1; /*開啟*/

-- 注意:
--- 1.MySQL中默認是自動提交
--- 2.使用事務時應先關閉自動提交

-- 開始一個事務,標記事務的起始點
START TRANSACTION

-- 提交一個事務給資料庫
COMMIT

-- 將事務回滾,數據回到本次事務的初始狀態
ROLLBACK

-- 還原MySQL資料庫的自動提交
SET autocommit =1;

-- 保存點
SAVEPOINT 保存點名稱 -- 設置一個事務保存點
ROLLBACK TO SAVEPOINT 保存點名稱 -- 回滾到保存點
RELEASE SAVEPOINT 保存點名稱 -- 刪除保存點
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
課堂測試題目

A在線買一款價格為500元商品,網上銀行轉賬.
A的銀行卡余額為2000,然後給商家B支付500.
商家B一開始的銀行卡余額為10000

創建資料庫shop和創建表account並插入2條數據
*/

CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `shop`;

CREATE TABLE `account` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`cash` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO account (`name`,`cash`)
VALUES('A',2000.00),('B',10000.00)

-- 轉賬實現
SET autocommit = 0; -- 關閉自動提交
START TRANSACTION; -- 開始一個事務,標記事務的起始點
UPDATE account SET cash=cash-500 WHERE `name`='A';
UPDATE account SET cash=cash+500 WHERE `name`='B';
COMMIT; -- 提交事務
# rollback;
SET autocommit = 1; -- 恢復自動提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
3事務實現方式-MVCC
1什麼是MVCC
MVCC是mysql的的多版本並發控制即multi-Version Concurrency Controller,mysql的innodb引擎支持MVVC。MVCC是為了實現事務的隔離性,通過版本號,避免同一數據在不同事務間的競爭,你可以把它當成基於多版本號的一種樂觀鎖。當然,這種樂觀鎖只在事務級別為RR(可重復讀)和RC(讀提交)生效。MVCC最大的好處,相信也是耳熟能詳:讀不加鎖,讀寫不沖突,極大的增加了系統的並發性能。

2MVCC的實現機制
InnoDB在每行數據都增加兩個隱藏欄位,一個記錄創建的版本號,一個記錄刪除的版本號。

在多版本並發控制中,為了保證數據操作在多線程過程中,保證事務隔離的機制,降低鎖競爭的壓力,保證較高的並發量。在每開啟一個事務時,會生成一個事務的版本號,被操作的數據會生成一條新的數據行(臨時),但是在提交前對其他事務是不可見的;對於數據的更新(包括增刪改)操作成功,會將這個版本號更新到數據的行中;事務提交成功,新的版本號也就更新到了此數據行中。這樣保證了每個事務操作的數據,都是互不影響的,也不存在鎖的問題。

3MVCC下的CRUD
SELECT:
當隔離級別是REPEATABLE READ時select操作,InnoDB每行數據來保證它符合兩個條件:
** 1 事務的版本號 大於等於 創建行版本號**
** 2 行數據的刪除版本 未定義 或者大於 事務版本號**
【行創建版本號 事務版本號 行刪除版本號】

INSERT:
InnoDB為這個新行 記錄 當前的系統版本號。

DELETE:
InnoDB將當前的系統版本號 設置為 這一行的刪除版本號。

UPDATE:
InnoDB會寫一個這行數據的新拷貝,這個拷貝的版本為 當前的系統版本號。它同時也會將這個版本號 寫到 舊行的刪除版本里。
————————————————
版權聲明:本文為CSDN博主「@Autowire」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zs18753479279/article/details/113933252

Ⅲ 多個資料庫實例,怎麼保持事務

我們這邊基本都是通過業務層的處理,來控制多個資料庫的事務的

Ⅳ 不同資料庫之間在使用事務時如何保證數據完整性

實體完整性,域完整性,參照完整性
請參考

Ⅳ spring能不能對多個資料庫進行事務管理

可以,Spring的事務處理能力是最綜合完整的,對編程式、聲明式均進行了支持,而且可以在不使用應用伺服器的情況下兼容應用伺服器事務。下面的是一個分布式的聲明事務,訪問多個數據源的配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">

<!-- Configurer that replaces ${...} placeholders with values from a properties

file -->

<!-- (in this case, JDBC-related settings for the dataSource definition

below) -->

<bean id="propertyConfigurer"

class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations">

<list>

<value>classpath*:spring/jdbc.properties</value>

</list>

</property>

</bean>

<bean id="dataSourceMysql" class="com.atomikos.jdbc.AtomikosDataSourceBean"

init-method="init" destroy-method="close">

<property name="uniqueResourceName" value="${mysql.uniqueResourceName}" />

<property name="xaDataSourceClassName" value="${mysql.xaDataSourceClassName}" />

<property name="xaProperties">

<props>

<prop key="user">${mysql.user}</prop>

<prop key="password">${mysql.password}</prop>

<prop key="URL">${mysql.url}</prop>

</props>

</property>

<property name="poolSize" value="${mysql.poolSize}" />

</bean>

<bean id="dataSourceOracle" class="com.atomikos.jdbc.AtomikosDataSourceBean"

init-method="init" destroy-method="close">

<property name="uniqueResourceName" value="${oracle.uniqueResourceName}" />

<property name="xaDataSourceClassName" value="${oracle.xaDataSourceClassName}" />

<property name="xaProperties">

<props>

<prop key="user">${oracle.user}</prop>

<prop key="password">${oracle.password}</prop>

<prop key="URL">${oracle.url}</prop>

</props>

</property>

<property name="poolSize" value="${oracle.poolSize}" />

</bean>

<!-- Construct Atomikos UserTransactionManager, needed to configure Spring -->

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"

init-method="init" destroy-method="close">

<!-- when close is called, should we force transactions to terminate or

not? -->

<property name="forceShutdown" value="${transactionManager.forceShutdown}" />

</bean>

<!-- Also use Atomikos UserTransactionImp, needed to configure Spring -->

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">

<property name="transactionTimeout" value="${transactionManager.transactionTimeout}" />

</bean>

<!-- Configure the Spring framework to use JTA transactions from Atomikos -->

<bean id="transactionManager"

class="org.springframework.transaction.jta.JtaTransactionManager">

<property name="transactionManager">

<ref bean="atomikosTransactionManager" />

</property>

<property name="userTransaction">

<ref bean="atomikosUserTransaction" />

</property>

</bean>

<bean id="txManager"

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

abstract="true">

<property name="transactionManager">

<ref bean="transactionManager" />

</property>

<property name="transactionAttributes">

<props>

<prop key="save*">PROPAGATION_REQUIRED, +AuaException</prop>

</props>

</property>

</bean>

<bean id="studentOracleDao" class="com.aua..oracle.StudentDao" />

<bean id="studentMysqlDao" class="com.aua..mysql.StudentDao" />

<bean id="studentService" parent="txManager">

<property name="target">

<bean class="com.aua.service.impl.StudentService" />

</property>

</bean>
</beans>

Ⅵ 兩個不同資料庫 同一事務 怎麼控制

你兩個資料庫是一個連接嗎?
是兩個連接的話,就未各個連接各開一個事務不就可以了嗎

至於那個先那個後的
呵呵,在第二個執行完了
先commit第一個再commit第二個

出現在commit時出錯的可能有多少?一般數據錯誤在提交時的錯誤比較少吧?

Ⅶ 「資料庫中的事務」是什麼

資料庫事務(Database Transaction) ,事務是一系列作為一個邏輯單元來執行的操作集合。它是資料庫維護數據一致性的單位,它將資料庫從一致狀態轉變為新的一致狀態,指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。事務是資料庫運行中的邏輯工作單位,由DBMS中的事務管理子系統負責事務的處理。

Ⅷ access 或 sql 可以實現多個資料庫的事務管理嗎

很多朋友想用sql2000資料庫的編程方法,但是卻又苦於自己是學access的,對sql只是一點點的了解而已,這里我給大家提供以下參考---將access轉化成sql2000的方法和注意事項
一,首先,我說的是在access2000,sql2000之間轉換,其他的我也還沒有嘗試過,希望大家多多試驗,肯定是有辦法的;
二,轉換的方法
1,打開」控制面板「下」管理工具「中的」資料庫源「;
2,按」添加「添加一個新的數據源,在選擇欄里選「driver
do
microsoft
access
(*.mdb)」,完成後將出現一個框,在「資料庫源」裡面輸入你想寫的名稱,我取名叫「abc」,說明不需要填,接著,按下面的選擇,尋找你的資料庫地址和選中(注意,請先備份自己的access資料庫),然後確定。數據源在這里建好了,剩下轉換了。
3,打開sql2000企業管理器,進入資料庫,新建一個空的資料庫「abc」;
4,選擇新建立的資料庫,按滑鼠右鍵,選擇「所有任務」下「導入數據」,按「下一步」繼續;
5,在資料庫源下拉但中選擇」driver
do
microsoft
access(*.mdb)「,在」用戶/系統dsn「中,選種你剛才添加的」abc「,按
」下一步「;
6,「目的」不需要修改,選擇伺服器(一般下為自己的本機local,也可以選擇伺服器地址或者區域網地址,確定你的許可權是否可以操作,),使用windows
身份驗證指用自己的系統管理員身份操作,使用sql身份操作驗證可以用於網站的操作,推薦用後者;
7,選上使用sql身份操作驗證後,填寫你的用戶名和密碼,我自己選擇的是系統默認號碼sa,****,資料庫選擇剛新建的abc,按下一步;
8,這一步的兩個單項選擇,從數據源復製表和視圖與用一條查詢指令指定要傳輸的數據,選擇前者,按下一步繼續;
9,這里將出現你自己access資料庫的表,按全選後,下一步;
10,dts導入/導出向導,看立即運行被選中按下一步,
11,按完成繼續;
12,這個步驟你將看到你的數據被導入sql2000裡面,當出現已經成功把xxx個表導入到資料庫的字樣,而且所有的表前面都有綠色的勾,就表示成功導入所有數據,如果中途出現問題或者表前面有紅色的叉的話,說明該表沒有成功導入,這時就要回去查看自己的操作是否正確了.
三,數據修改
1,由於sql2000裡面沒有自動編號,所以你的以自動編號設置的欄位都會變成非空的欄位,這就必須手工修改這些欄位,並把他的標示選擇是,種子為1,增量為1,
2,另外,access2000轉換成sql2000後,原來屬性為是/否的欄位將被轉換成非空的bit,這時候你必須修改成自己想要的屬性了;
3,另外,大家要注意對時間函數的把握.access與sql是有很多不同的.
access轉ms
sql資料庫的幾點經驗
1.access的資料庫中的自動編號類型在轉化時,sql
server並沒有將它設為自動編號型,我們需在sql創建語句中加上identity,表示自動編號!
2.轉化時,跟日期有關的欄位,sql
server默認為smalldatetime型,我們最好將它變為datetime型,因為datetime型的范圍比smalldatetime型大。我遇見這種情況,用smalldatetime型時,轉化失敗,而用datetime型時,轉化成功。
3.對此兩種資料庫進行操作的sql語句不全相同,例如:在對access資料庫進行刪除紀錄時用:delete
*
from
user
where
id=10,而對sql
server資料庫進行刪除是用:delete
user
where
id=10.
4.日期函數不相同,在對access資料庫處理中,可用date()、time()等函數,但對sql
server資料庫處理中,只能用datediff,dateadd等函數,而不能用date()、time()等函數。
5.在對access資料庫處理中,sql語句中直接可以用一些vb的函數,像cstr()函數,而對sql
server資料庫處理中,卻不能用。