日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

事务传播机制/数据库异常解析——2016-8-13分享总结

發布時間:2023/12/13 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 事务传播机制/数据库异常解析——2016-8-13分享总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 事務的傳播機制/required 跟 required new 的使用與區別

基礎回顧

1.1 事務的隔離級別

  ISOLATION_READ_UNCOMMITTED(讀未提交)

  ISOLATION_READ_COMMITTED(讀已提交)

  ISOLATION_REPEATABLE_READ(可重復讀)

  ISOLATION_SERIALIZABLE(序列化)    

  ISOLATION_DEFAULT(使用數據庫默認隔離級別)

1.2 臟讀,不可重復讀以及幻讀

  臟讀:一個事務讀取到另一事務未提交的更新新據。

  不可重復讀:在同一事務中,多次讀取同一數據返回的結果有所不同。換句話說就是,后續讀取可以讀到另一事務已提交的更新數據。

  幻讀:事務1正常查詢一次,之后事務2插入滿足事務1查詢條件的新行,再次用事務1查詢,得到多出來的數據。

1.3 事務的傳播屬性

  PROPAGATION_REQUIRED: ?支持當前事務,沒有則新建

  PROPAGATION_REQUIRESNEW: ?新建事務,如果當前存在事務,把當前事務掛起

  PROPAGATION_SUPPORTS:支持當前事務,如果當前沒有事務,就以非事務方式執行

  PROPAGATION_MANDATORY:支持當前事務,如果當前沒有事務,就拋出異常

  PROPAGATION_NOT_SUPPORTED:以非事務方式執行,如果當前存在事務,就把當前事務掛起。也就是說業務方法不需要事務

  PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。也就是說業務方法絕對不能在事務范圍內執行

  PROPAGATION_NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中。 如果沒有活動事務, 則按REQUIRED屬性執行  

二. 事務的回滾及傳播機制總結

  1. 首先要注意的是 spring 的默認回滾,roll-back = “runtimeException”,即 spring 只回滾接收到的運行時異常,對于其他異常則不回滾;

  源碼解析:

/*** Handle a throwable, completing the transaction.* We may commit or roll back, depending on the configuration.* @param txInfo information about the current transaction* @param ex throwable encountered*/protected void completeTransactionAfterThrowing(TransactionInfo txInfo, Throwable ex) {if (txInfo != null && txInfo.hasTransaction()) {if (logger.isTraceEnabled()) {logger.trace("Completing transaction for [" + txInfo.getJoinpointIdentification() +"] after exception: " + ex);}if (txInfo.transactionAttribute.rollbackOn(ex)) {try {txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());}catch (TransactionSystemException ex2) {logger.error("Application exception overridden by rollback exception", ex);ex2.initApplicationException(ex);throw ex2;} ...

  注意上述有一段是?txInfo.transactionAttribute.rollbackOn(ex) 方法,跟進此方法:

/*** The default behavior is as with EJB: rollback on unchecked exception.* Additionally attempt to rollback on Error.* <p>This is consistent with TransactionTemplate's default behavior.*/public boolean rollbackOn(Throwable ex) {return (ex instanceof RuntimeException || ex instanceof Error);}

  所以,默認不修改的話,只回滾 RuntimeException 或者 Error

  2. 對此我們可以針對性的添加需要回滾的策略,或者直接顯示設置 roll-back = “Exception”,即回滾所有異常;

  3. 需要注意的是:普通情況下,如果異常被 try-catch 處理了,并為進一步拋出異常,那么由于 spring 并未接受到異常, 所以也不會回滾;

  ?本周討論補充知識:

  4. 異常分為 應用層拋出 的異常,以及 數據庫 的異常,如果是前者,可以正常應用 spring 的事務傳播規則,如果是后者,那么一旦發生,數據庫端就已經放棄事務,也就沒有回滾一說();

  例: int 10/0 為應用層的異常,可以正常回滾; insert 提交一個已存在的 唯一字段,那么數據庫會報錯,由于事務本身也是由 spring 告之數據庫處理,這種情況下,由于 數據庫已經放棄事務,那么 spring 層面也不能進行事務回滾;

  5. 正常情況下不會出現一個接口的 bean 進行嵌套調用,如果有,該情況下,由于代理類不再使用 spring 動態代理中的接口實現的方式,而是采用 cglib 的繼承實現方式,同樣也會導致傳播失效;

  6. 事務的傳播機制較為常用的為:required,required-new,support。討論結果為 required-new 跟 required 相比,使用應較為謹慎,原因:同一事務粒度更細更可控,同時也能避免 嵌套事務 可能導致的復雜情況,當然,具體情況需要根據具體業務來定,比如本次討論中的項目,由于每一次操作的對象都要及時被可能存在的另一進程知悉,這種情況下需要 required-new 來實時開啟事務告之其他進程;

  查詢總結過程中發現的其它知識點

  1. 注意的小點,MySQL 中 InnoDB 支持事務,MyIsam 并不支持事務;

  2. spring 已經提供了異常處理機制,其基類為?DataAccessException ,它是 RuntimeExcption 的一個子類,據此可以知道,所有從 數據庫返回的異常,都會被 spring 處理后 歸屬于 RuntimeException 中,其體系如下:

  

2. 在?org.springframework.jdbc.support包下有sql-error-codes.xml文件,里面預定義了一些錯誤代碼和信息,其 bean 為 HSQL,在 第8行,我們可以發現重復插入的 code 為 -104;

bean id="HSQL" class="org.springframework.jdbc.support.SQLErrorCodes" property name="databaseProductName" valueHSQL Database Engine/value /property property name="badSqlGrammarCodes" value-22,-28/value /property property name="duplicateKeyCodes" value-104/value /property property name="dataIntegrityViolationCodes" value-9/value /property property name="dataAccessResourceFailureCodes" value-80/value /property /bean

  3. 此外,我們可以知道發散性的看,我們完全可以自定義數據庫異常的信息,方法如下:

  3.1?重新新建一個sql-error-codes.xml代碼,并將它放到類路徑的根目錄下,這樣Spring會發現它并使用我們自定義的文件。同時HSQL的bean的名稱不要改,并將useSqlStateForTranslation置為false,就可以使用我們自己定義的異常類;

bean id="HSQL" class="org.springframework.jdbc.support.SQLErrorCodes" property name="databaseProductName" value="HSQL Database Engine" / property name="useSqlStateForTranslation" value="false" / property name="customTranslations" list ref local="vehicleDuplicateKeyTranslation" / /list /property /bean bean id="vehicleDuplicateKeyTranslation" class="org.springframework.jdbc.support.CustomSQLErrorCodesTranslation" property name="errorCodes" value="-104" / property name="exceptionClass" value="org.ourpioneer.vehicle.exception.VehicleDuplicateKeyException" / /bean

  3.2 可以看到結果,控制臺所打印的異常類型為我們自己定義的異常類型;

  3.3?除此之外,還可以實現SQLExceptionTranslator接口,并在JDBC模板中注入其實例來實現異常控制

1. package org.ourpioneer.vehicle.exception; 2. import java.sql.SQLException; 3. import org.springframework.dao.DataAccessException; 4. import org.springframework.jdbc.UncategorizedSQLException; 5. import org.springframework.jdbc.support.SQLExceptionTranslator; 6. public class VehicleDuplicateKeyTranslator implements SQLExceptionTranslator { 7. public DataAccessException translate(String task, String sql, 8. SQLException ex) { 9. if (task == null) { 10. task = ""; 11. } 12. if (sql == null) { 13. } 14. if (ex.getErrorCode() == -104) { 15. return new VehicleDuplicateKeyException(buildMessage(task, sql, ex)); 16. } else { 17. return new UncategorizedSQLException(task, sql, ex); 18. } 19. } 20. private String buildMessage(String task, String sql, SQLException ex) { 21. return "數據庫操作異常:" + task + "; SQL [" + sql + "]; " + ex.getMessage(); 22. } 23. }

  3.4?translate方法有三個參數,task表示當前操作要進行的任務是什么,sql就是執行的sql語句,ex表示SQLException,我們可以從中獲取異常信息,其處理代碼僅僅捕捉了錯誤碼為-104(HSQL數據庫)的錯誤,其余的配置信息可以根據需要來自行添加。之后要在Spring中重新配置它們:

1. bean id="vehicleDuplicateKeyTranslator" 2. class="org.ourpioneer.vehicle.exception.VehicleDuplicateKeyTranslator"/bean 3. bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" 4. property name="exceptionTranslator" ref="vehicleDuplicateKeyTranslator" / 5. property name="dataSource" ref="dataSource" / 6. /bean 7. bean id="vehicleDAO" class="org.ourpioneer.vehicle.dao.VehicleDAOImpl" 8. property name="jdbcTemplate" ref="jdbcTemplate" / 9. /bean

  3.5 測試結果

?

三. 總結

  其實之前對事務的理解是比較基礎的,經過周六的交流和學習,才對事務有了略深一層的理解,但同時也愈發覺得事務的博大精深應遠不止于此,本文大部分都是結合各位?同事的理解和網上的一些資料整理的文章,所以本文作用更多的督促自己的學習進步,希望以后自己能不斷的吸收,整理和提煉知識?。

?

參考文獻:

mysql隔離級別及事務傳播:https://gist.github.com/JagoWang/4555317

mysql事務管理及spring聲明式事務中主動異常拋出使數據庫回滾:http://www.cnblogs.com/wanglonghai/p/4866512.html

Spring訪問數據庫異常的處理方法:http://kb.cnblogs.com/page/89216/

轉載于:https://www.cnblogs.com/Mr-Persist/p/5773314.html

總結

以上是生活随笔為你收集整理的事务传播机制/数据库异常解析——2016-8-13分享总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 婷婷亚洲激情 | 国产伦一区二区三区 | av在线天天 | 日本污网站 | 曰批视频在线观看 | 日日cao| 18禁一区二区 | 欧美多人猛交狂配 | 精品人妻人伦一区二区有限公司 | 成人欧美一区二区三区在线播放 | 射射综合网 | 99riav1国产精品视频 | 日本激情视频一区二区三区 | 日本三级中国三级99人妇网站 | 亚洲国产一区二区a毛片 | 女女互磨互喷水高潮les呻吟 | 男女草逼视频 | 麻豆蜜桃在线观看 | 亚洲天堂性 | 久久综合久久网 | 欧美午夜不卡 | 久久综合色婷婷 | 亚洲色图偷 | 免费一级特黄特色大片 | 国产精品中文在线 | 久久久久99精品成人片试看 | 男人午夜天堂 | 最新av片| 国产裸体无遮挡 | 国产第4页 | 激情婷| 五月婷婷丁香六月 | 在线观看国产区 | 国产乱码精品一区二区三区忘忧草 | 国产哺乳奶水91在线播放 | 在线看黄网址 | 国产综合久久久久久鬼色 | 国产成人在线视频观看 | 亚洲av无码国产精品久久久久 | 欧美一区二区三 | 久久国产精品系列 | 五月婷婷俺也去 | 美日韩黄色片 | 精品国产青草久久久久96 | 黄色一级淫片 | 免费av手机在线观看 | 欧美人与动性xxxxx杂性 | 美丽的姑娘在线观看 | 天天视频黄 | 国产免费999| 国产在线国偷精品免费看 | 这里有精品视频 | 日韩在线观看一区二区 | 欧美超逼视频 | 欧美一a一片一级一片 | 综合久久2o19 | 97久久免费视频 | a级小视频 | 亚州国产精品视频 | 日韩久久一级片 | 亚洲AV无码精品黑人黑人 | 亚洲色图17p | 亚洲综合第一 | 欧美成人精品欧美一级乱 | 久久精品美女 | 神马午夜伦 | 人人av在线 | 精品国产视频在线 | av不卡在线观看 | 国产精品一区二区入口九绯色 | 国产免费午夜 | 欧美福利网 | 福利一区二区在线 | 国产中文字幕网 | 漂亮少妇高潮午夜精品 | 色一情一伦一子一伦一区 | 欧美精品xx | 日韩欧美第一区 | 欧美人体一区二区三区 | 在线视频激情小说 | av黄色天堂 | 五月婷婷,六月丁香 | 国产在线麻豆精品观看 | 岛国大片在线 | 欧美九九九 | 亚洲国产日韩欧美在线观看 | av在线播放观看 | 三级自拍视频 | 小箩莉末发育娇小性色xxxx | 黄色免费在线观看网站 | 亚欧视频在线观看 | 毛片av网站 | 天天成人 | 国产成人97精品免费看片 | 色婷婷综合久久久久中文一区二区 | 欧美日韩一区二 | 2025av在线播放 | av手机网站| 日本久久片 |