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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

jdbctemplate 开启事务_Spring(四):事务管理

發(fā)布時(shí)間:2024/7/5 javascript 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jdbctemplate 开启事务_Spring(四):事务管理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

事務(wù)

首先,我們要知道事務(wù)是什么

構(gòu)成單一邏輯工作單元的操作集合稱(chēng)為事務(wù)

事務(wù)的ACID特性

  • 原子性:不可分割的最小操作單位,要么同時(shí)成功,要么同時(shí)失敗
  • 一致性:事務(wù)操作前后,數(shù)據(jù)總量不變
  • 隔離性:多個(gè)事務(wù)之間相互獨(dú)立
  • 持久性:當(dāng)事務(wù)提交或回滾后,數(shù)據(jù)會(huì)持久化的保存數(shù)據(jù)

傳統(tǒng)編程的事務(wù)管理

在傳統(tǒng)的JAVA數(shù)據(jù)庫(kù)編程中,我們遵循的是打開(kāi)連接-執(zhí)行操作-提交事務(wù)-關(guān)閉連接,如下面的代碼:

Connection con = getCon();con.setAutoCommit(false);con.prepareStatement("UPDATE...").execute();con.prepareStatement("UPDATE...").execute();con.commit();//conn.rollback();con.close();

這樣就產(chǎn)生了很多模板代碼,而且依靠程序員手動(dòng)提交事務(wù),也十分不可靠

Spring對(duì)事務(wù)的管理

Spring的事務(wù)管理分為兩類(lèi)

  • 聲明式事務(wù)
  • 編程式事務(wù)

Spring定義了一個(gè)接口PlatformTransactionManager ,我們只需要使用其實(shí)現(xiàn)類(lèi),將數(shù)據(jù)源交其管理,即可實(shí)現(xiàn)Spring事務(wù)管理

@Configuration@EnableTransactionManagement // 開(kāi)啟事務(wù)管理@ComponentScan("wang.ismy.spring")public class Config { @Bean public DataSource dataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setUrl("jdbc:mysql:///test"); druidDataSource.setUsername("root"); druidDataSource.setPassword("123"); return druidDataSource; } @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource){ return new JdbcTemplate(dataSource); } @Bean public PlatformTransactionManager transactionManager(DataSource dataSource){ return new DataSourceTransactionManager(dataSource); }}

這樣,當(dāng)你在你的service中拋出異常的時(shí)候,Spring就會(huì)自動(dòng)幫你進(jìn)行事務(wù)回滾

@Transactional(rollbackFor = Exception.class) // Spring默認(rèn)只對(duì)運(yùn)行期異常回滾,加上該屬性,則設(shè)置回滾的異常類(lèi)型為Exception public void transfer() { jdbcTemplate.execute("UPDATE account SET amount = 90 WHERE name = 'alice'"); int a=1/0; jdbcTemplate.execute("UPDATE account SET amount = 110 WHERE name = 'bob'"); }

屬性

@Transactional注解的一些屬性說(shuō)明如下

  • read-only:是否是只讀事務(wù)。默認(rèn)false,不只讀。
  • isolation:指定事務(wù)的隔離級(jí)別。默認(rèn)值是使用數(shù)據(jù)庫(kù)的默認(rèn)隔離級(jí)別。
  • propagation:指定事務(wù)的傳播行為。
  • timeout:指定超時(shí)時(shí)間。默認(rèn)值為:-1。永不超時(shí)。
  • rollback-for:用于指定一個(gè)異常,當(dāng)執(zhí)行產(chǎn)生該異常時(shí),事務(wù)回滾。產(chǎn)生其他異常,事務(wù)不回滾。沒(méi)有默認(rèn)值,任何異常都回滾。
  • no-rollback-for:用于指定一個(gè)異常,當(dāng)產(chǎn)生該異常時(shí),事務(wù)不回滾,產(chǎn)生其他異常時(shí),事務(wù)回滾。沒(méi)有默認(rèn)值,任何異常都回滾。

理解事務(wù)的傳播行為

  • PROPAGATION_REQUIRED

簡(jiǎn)單來(lái)說(shuō)就是兩個(gè)被事務(wù)管理的方法都將在同一個(gè)事務(wù)內(nèi)執(zhí)行

  • PROPAGATION_REQUIRES_NEW

而這個(gè)傳播行為則是開(kāi)啟一個(gè)新事務(wù)

  • PROPAGATION_NESTED

該傳播行為則是與JDBC的保存點(diǎn)一樣,它使用了物理事務(wù)的保存點(diǎn)的概念

編程式事務(wù)

一般來(lái)說(shuō),編程式事務(wù)很少用,它就是把一些對(duì)數(shù)據(jù)庫(kù)的更新操作放在一起,來(lái)達(dá)到事務(wù)管理的目的

首先,我們需要一個(gè)

@Bean public TransactionTemplate transactionTemplate(PlatformTransactionManager manager){ return new TransactionTemplate(manager); }

在使用的時(shí)候注入這個(gè)Template進(jìn)行操作

public void transfer(){ transactionTemplate.execute((TransactionCallback) status -> { String sql = "UPDATE account SET money = money -200 WHERE uid = 41"; String sql1 = "UPDATE account SET money = money +200 WHERE uid = 45"; jdbcTemplate.update(sql); jdbcTemplate.update(sql1); return null; }); }

這樣,也能進(jìn)行事務(wù)管理

原理

最后,來(lái)探討一下Spring事務(wù)管理的原理

一句話,事務(wù)管理是通過(guò)AOP實(shí)現(xiàn)的,這個(gè)我們通過(guò)獲取Bean的實(shí)際類(lèi)型就知道

System.out.println(context.getBean(AccountService.class).getClass());// 結(jié)果:class wang.ismy.spring.AccountService$$EnhancerBySpringCGLIB$$f8bd6705

這是Spring官網(wǎng)給出的一個(gè)受事務(wù)管理的概念視圖:

AOP增強(qiáng)了我們的Service類(lèi),當(dāng)真實(shí)的方法被調(diào)用前與調(diào)用后,Spring替我們完成commit/rollback等操作,以實(shí)現(xiàn)事務(wù)管理

總結(jié)

以上是生活随笔為你收集整理的jdbctemplate 开启事务_Spring(四):事务管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。