1.比如一個事務中右兩個事件:(1).修改資料庫A表中id=1的name值為小明 (2).洗掉資料庫B表id=2的資料
2.如果java中的事務 都需要保證同一個資料庫鏈接,那么我們用反證法,既: 不是同一個資料庫鏈接 事務無法回滾
3.而我則認為不同的資料庫鏈接也無所謂 ,事務可以回滾
另外:非常反感囫圇吞棗式回答,比如:事務當然要保證同一個資料庫鏈接..等等
謝謝各位大神
uj5u.com熱心網友回復:
我的理解:兩個事件在同一個事務中,那就具備了原子性,要么都發生,要么都不發生。
資料庫A操作失敗,事務回滾,不再執行資料庫B的操作。如果A成功,B失敗,B資料庫事務回滾,但此時A已經完成了事務的提交,不可回滾,不然違反了原子性。
uj5u.com熱心網友回復:
同庫事務管理簡單,只要開啟一次事務,提交一次或者回滾一次即可。跨庫的話,需要管理多個事務的開啟、提交、回滾,比較復雜。
但是并不表示跨庫事務無法實作,只是盡量避免跨庫事務。
uj5u.com熱心網友回復:
我理解的事務對同一資料源開啟事務管理 要么成功提交,要么失敗回滾(ok,廢話)
其實程式代碼中事務概念的實作最后還是會轉化成資料庫事務的存盤程序
所以必須得保證是同一個連接,比如通過jdbc操作資料源的話保證同一個connection 物件
如果不能得到保證,那也就違反了事務所提及的原子性,一致性,資料的統一性也得不到保證(那還用個p的事務)
要想操作多個資料源的應用場景,建議使用分布式事務來達成統一提交或者回滾
樓主明白了單個事務的原理 ,分布式事務,小菜一碟。
uj5u.com熱心網友回復:
首先,如果使用了連接池,你的對資料的操作,使用的是連接池分配給你的某個資料庫連接。在處理例外的代碼中,如果你能獲取到兩個連接,讓兩個連接都開啟事務,發生到例外后,你讓著兩個連接都回滾當然也沒有問題,但是這樣浪費連接資源。通常的做法是,將一組具有完整業務邏輯對資料庫的更新放在一個連接中依次提交,發生例外時,回滾該連接即可。uj5u.com熱心網友回復:
你對事務的理解貌似有點問題,java提交/回滾的事務只是呼叫資料庫api罷了就像你說的,多個連接,如果不支持xa事務的話(xa事務一樣存在極低概率不一致),那么很容易發生提交/回滾不一致,比如A連接提交成功,B連接提交的時候,突然發生了錯誤,這個時候A你是無法回滾的,就會出現不一致,這個時候就算資料庫是一個,資料庫也是無法知道A,B在一個事務的,對資料庫來講,他就是不同的請求,資料庫不同的話那就是更加不可知了
建議你去了解下資料庫是在極端情況下如何做到資料一致的,極端情況是斷網/宕機/呼叫服務超時等等,然后再了解下XA事務,其他分布式情況下的資料一致性
uj5u.com熱心網友回復:
老哥,如果你在事務中執行一個表的修改,然后這個表就會被這個事務鎖住,如果你另外啟用一個sql連接去查詢這個表,這個表由于一直被事務占用,所以你是查不出來的,因為事務你還沒提交,當然你可以設定修改操作位行鎖定操作而不是表鎖定操作,不然你修改了這個表但是事務還沒提交,別人查詢的時候是查詢的之前的資訊還是你操作過之后的資訊uj5u.com熱心網友回復:
樓主1說錯了哦,事務:所謂事務,就是要完成一件事情,在這個事情中包含了多個任務當所有的任務都執行成功,這個事情就是成功的:所有改動的資料生效
當任意一個任務執行失敗,這個事情就是失敗的:所有改動的資料回退
uj5u.com熱心網友回復:
看了這么多回答,沒一個說清楚的。要操作資料庫首先要建立連接吧。建立連接后開啟會話,一個事務只能在一個會話中提交。 一個事務可以操作多個資料庫。 不同的連接,建立的會話肯定不是同一個。所以不存在一個事務包含兩個連接的情況。uj5u.com熱心網友回復:
資料庫的事務都是在當前資料庫里面的,資料庫的ACID原則,以及資料隔離級別也都是針對當前庫來說的。就好比你要去A,B兩家串門,A和B是不知道你去了其他地方沒有,也不知道你在其他地方做了什么事,也就無從干涉。你這種操作多個庫的事務設計到分布式事務的問題,需要通過其他的方式來解決。比如:2PC、TCC、MQ的事務訊息等方式uj5u.com熱心網友回復:
兩個庫的要保證原子性那就是分布式事務了,而且事務不是說在同一個庫事務就會生效,他們必須在同一個連接才行,如果操作的是同一個資料庫,但是連接不同,事務同樣不會生效,現在分布式事務也很完善了,比如阿里的seat就很不錯。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/111709.html
標籤:Java EE
下一篇:sort對陣列排序問題求助
