使用spring的TransactionTemplate操作資料庫事務
阿新 • • 發佈:2019-01-04
場景:使用spring的TransactionTemplate操作資料庫事務
1.事務操作過程
/**事務操作過程*/ @SuppressWarnings("unchecked") public static void doTransaction(){ /**1.建立事務管理器*/ DataSourceTransactionManager manager = new DataSourceTransactionManager(dataSource); /**2.建立事務模板*/ TransactionTemplate template = new TransactionTemplate(manager); /**3.呼叫事務模板執行函式,傳入事務回撥物件並重寫回調函式*/ Object rtnObj = template.execute(new TransactionCallback(){ @Override public Object doInTransaction(TransactionStatus transactionStatus) { try{ /**第一條插入語句表真實存在*/ logger.info("執行insert...開始"); insert(); logger.info("執行insert...結束"); /**第二條插入語句表不存在,即sql會執行失敗*/ logger.info("執行insert2...開始"); insert2(); logger.info("執行insert2...結束"); return "成功"; }catch(Exception e){ /** 事務回滾的關鍵,必須加上*/ transactionStatus.setRollbackOnly(); e.printStackTrace(); logger.info("資料庫,部分sql操作不正確,事務回滾."); return "失敗"; } } }); /**4.檢視結果*/ if(rtnObj instanceof String){ String rtn = rtnObj.toString(); if("成功".equals(rtn)){ logger.info("操作成功!"); }else{ logger.info("操作失敗,請檢查入參是否正確"); } } }
2.測試完整程式碼
public class OperateTransactionTemplate { private static Logger logger = LoggerFactory.getLogger(OperateTransactionTemplate.class); /**資料庫連線需要字串*/ public static final String username = "root"; public static final String password = "123456"; public static final String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/zbzdb"; public static final String driverName = "com.mysql.jdbc.Driver"; /**資料來源*/ public static DataSource dataSource = getDataSource(); /**JdbcTemplate操作模板*/ public static JdbcTemplate jdbcTemplate = getJdbcTemplate(); /**獲取資料來源*/ public static DataSource getDataSource(){ if(dataSource !=null){ return dataSource; } DruidDataSource dataSource = new DruidDataSource(); // 設定資料來源屬性引數 dataSource.setPassword(password); dataSource.setUrl(jdbcUrl); dataSource.setUsername(username); dataSource.setDriverClassName(driverName); return dataSource; } /**獲取操作資料庫模板*/ public static JdbcTemplate getJdbcTemplate() { JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(dataSource); return jdbcTemplate; } /**事務操作過程*/ @SuppressWarnings("unchecked") public static void doTransaction(){ /**1.建立事務管理器*/ DataSourceTransactionManager manager = new DataSourceTransactionManager(dataSource); /**2.建立事務模板*/ TransactionTemplate template = new TransactionTemplate(manager); /**3.呼叫事務模板執行函式,傳入事務回撥物件並重寫回調函式*/ Object rtnObj = template.execute(new TransactionCallback(){ @Override public Object doInTransaction(TransactionStatus transactionStatus) { try{ /**第一條插入語句表真實存在*/ logger.info("執行insert...開始"); insert(); logger.info("執行insert...結束"); /**第二條插入語句表不存在,即sql會執行失敗*/ logger.info("執行insert2...開始"); insert2(); logger.info("執行insert2...結束"); return "成功"; }catch(Exception e){ /** 事務回滾的關鍵,必須加上*/ transactionStatus.setRollbackOnly(); e.printStackTrace(); logger.info("資料庫,部分sql操作不正確,事務回滾."); return "失敗"; } } }); /**4.檢視結果*/ if(rtnObj instanceof String){ String rtn = rtnObj.toString(); if("成功".equals(rtn)){ logger.info("操作成功!"); }else{ logger.info("操作失敗,請檢查入參是否正確"); } } } /**插入語句表真實存在*/ public static void insert(){ /**1.組裝sql*/ String sql = "INSERT INTO t_city (CITY_NAME,LAND_AREA,POPULATION,GROSS,AREA_NUMBER ) VALUE('泉州',11014.78, 865, 7548.01, '350500' ) "; /**2.呼叫update*/ jdbcTemplate.update(sql); } /**插入語句表不存在*/ public static void insert2(){ /**1.組裝sql*/ String sql = "INSERT INTO t_city2 (CITY_NAME,LAND_AREA,POPULATION,GROSS,AREA_NUMBER ) VALUE('泉州',11014.78, 865, 7548.01, '350500' ) "; /**2.呼叫update*/ jdbcTemplate.update(sql); } public static void main(String []args){ logger.info("測試開始......"); doTransaction(); logger.info("測試結束......"); } }
3.建表語句
CREATE TABLE `t_city` ( `CITY_NAME` VARCHAR(64) COLLATE utf8_bin NOT NULL COMMENT '城市名', `LAND_AREA` DOUBLE DEFAULT NULL COMMENT '城市面積', `POPULATION` BIGINT(16) DEFAULT NULL COMMENT '城市人口', `GROSS` DOUBLE DEFAULT NULL COMMENT '生產總值', `AREA_NUMBER` VARCHAR(64) COLLATE utf8_bin DEFAULT NULL COMMENT '行政區劃程式碼', `POSTAL_CODE` VARCHAR(64) COLLATE utf8_bin DEFAULT NULL COMMENT '郵政編碼', `TELEPHONE_CODE` VARCHAR(64) COLLATE utf8_bin DEFAULT NULL COMMENT '電話區號', `CAR_CODE` VARCHAR(64) COLLATE utf8_bin DEFAULT NULL COMMENT '車牌程式碼', `CITY_DESCRIBE` VARCHAR(512) COLLATE utf8_bin DEFAULT NULL COMMENT '城市描述' ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='城市資訊表'
以上,TKS.