中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

建站公司沒(méi)前端網(wǎng)站推廣app下載

建站公司沒(méi)前端,網(wǎng)站推廣app下載,wordpress 網(wǎng)站優(yōu)化,南平網(wǎng)絡(luò)推廣目錄 1. 事務(wù)定義 2. MySQL 中的事務(wù)使用 3. 沒(méi)有事務(wù)時(shí)的插入 4. Spring 編程式事務(wù) 5. Spring 聲明式事務(wù) 5.1 Transactional 作用范圍 5.2 Transactional 參數(shù)說(shuō)明 5.3 Transactional 工作原理 1. 事務(wù)定義 將?組操作封裝成一個(gè)執(zhí)行單元(封裝到一起…

目錄

1. 事務(wù)定義

2. MySQL 中的事務(wù)使用

3. 沒(méi)有事務(wù)時(shí)的插入

4. Spring 編程式事務(wù)

5. Spring 聲明式事務(wù)

5.1? @Transactional 作用范圍

5.2??@Transactional 參數(shù)說(shuō)明

5.3??@Transactional 工作原理


1. 事務(wù)定義

將?組操作封裝成一個(gè)執(zhí)行單元(封裝到一起),要么全部成功,要么全部失敗。
為什么要用事務(wù)?
比如轉(zhuǎn)賬分為兩個(gè)操作:
第一步操作:A -100
第二步操作:A+100
果沒(méi)有事務(wù),第一步執(zhí)行成功了,第二步執(zhí)行失敗了,那么 A 賬戶平高白無(wú)故的 100 元就沒(méi)有 了。而如果使用事務(wù)就可以解決這個(gè)問(wèn)題,讓這?組操作要么一起成功,要么一起失敗。

2. MySQL 中的事務(wù)使用

事務(wù)在 MySQL 有 3 個(gè)重要的操作:開(kāi)啟事務(wù)、提交事務(wù)、回滾事務(wù),它們對(duì)應(yīng)的操作命令如下:
--開(kāi)啟事務(wù)
start transaction;
--業(yè)務(wù)執(zhí)行--提交事務(wù)
commit;--回滾事務(wù)
rollback;

3. 沒(méi)有事務(wù)時(shí)的插入

@Mapper
public interface UserMapper {// 插入數(shù)據(jù)Integer insert(User user);}
@Data
public class User {private Integer id;private String username;private String password;private String photo;private Date createtime;private Date updatetime;public User(){}public User(String username, String password) {this.username = username;this.password = password;}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper"><insert id="insert">insert into userinfo (username,password,photo)values(#{username},#{password},#{photo})
</mapper>
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public Integer insert(User user){return userMapper.insert(user);}
}
@RequestMapping("/trans")
@RestController
public class TransactionalController {@Autowiredprivate UserService userService;@RequestMapping("/addUser")public Integer addUser(String username,String password){User user = new User(username,password);return userService.insert(user);}
}

?在運(yùn)行前查看數(shù)據(jù)庫(kù)的數(shù)據(jù)如下圖所示:

?運(yùn)行以上代碼后可以看到:

此時(shí)可以看到數(shù)據(jù)成功插入:?

4. Spring 編程式事務(wù)

@Slf4j
@RequestMapping("/trans")
@RestController
public class TransactionalController {@Autowiredprivate UserService userService;// 獲取數(shù)據(jù)庫(kù)事務(wù)管理器@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;private TransactionDefinition transactionDefinition;@RequestMapping("/addUser")public Integer addUser(String username,String password){TransactionStatus transaction = dataSourceTransactionManager.getTransaction(transactionDefinition);User user = new User(username,password);Integer result = userService.insert(user);log.info("影響行數(shù):" +result);// 事務(wù)回滾dataSourceTransactionManager.rollback(transaction);return result;}
}

運(yùn)行成功,返回1:?

?但是,此時(shí)可以看到數(shù)據(jù)庫(kù)中的數(shù)據(jù)并未添加:

這是因?yàn)槭聞?wù)進(jìn)行了回滾。接下來(lái)我們看一下事務(wù)的提交

@Slf4j
@RequestMapping("/trans")
@RestController
public class TransactionalController {@Autowiredprivate UserService userService;// 獲取數(shù)據(jù)庫(kù)事務(wù)管理器@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;@Autowiredprivate TransactionDefinition transactionDefinition;@RequestMapping("/addUser")public Integer addUser(String username,String password){TransactionStatus transaction = dataSourceTransactionManager.getTransaction(transactionDefinition);User user = new User(username,password);Integer result = userService.insert(user);log.info("影響行數(shù):" +result);// 事務(wù)回滾
//        dataSourceTransactionManager.rollback(transaction);// 提交事務(wù)dataSourceTransactionManager.commit(transaction);return result;}
}

可以看到數(shù)據(jù)此時(shí)提交成功:

5. Spring 聲明式事務(wù)

@Slf4j
@RequestMapping("/trans2")
@RestController
public class TransactionalController2 {@Autowiredprivate UserService userService;@Transactional@RequestMapping("/addUser")public Integer addUser(String username,String password){User user = new User(username,password);Integer result = userService.insert(user);log.info("影響行數(shù):"+result);return result;}
}

?根據(jù)打印的日志我們可以看到數(shù)據(jù)提交成功了:

那么,我們?nèi)绾巫屖聞?wù)進(jìn)行回滾呢?

手動(dòng)添加異常:

@Slf4j
@RequestMapping("/trans2")
@RestController
public class TransactionalController2 {@Autowiredprivate UserService userService;@Transactional@RequestMapping("/addUser")public Integer addUser(String username,String password){User user = new User(username,password);Integer result = userService.insert(user);log.info("影響行數(shù):"+result);int a = 10/0;return result;}
}

?運(yùn)行結(jié)果:

?可以看到數(shù)據(jù)并沒(méi)有提交:

?查看日志可以發(fā)現(xiàn),此時(shí)打印的日志和事務(wù)回滾時(shí)的日志相同:

此時(shí),我們?nèi)サ糇⒔?@Transactional:

@Slf4j
@RequestMapping("/trans2")
@RestController
public class TransactionalController2 {@Autowiredprivate UserService userService;//    @Transactional@RequestMapping("/addUser")public Integer addUser(String username,String password){User user = new User(username,password);Integer result = userService.insert(user);log.info("影響行數(shù):"+result);int a = 10/0;return result;}
}

也就是說(shuō),在沒(méi)有注解 @Transactional 時(shí),數(shù)據(jù)是可以提交成功的;添加注解?@Transactional,當(dāng)有異常時(shí),事務(wù)會(huì)進(jìn)行回滾。

通過(guò)注解,不需要我們手動(dòng)開(kāi)啟事務(wù)和關(guān)閉事務(wù),如果程序執(zhí)行成功,自動(dòng)提交事務(wù);如果程序執(zhí)行異常,自動(dòng)回滾事務(wù)。

5.1? @Transactional 作用范圍

@Transactional 可以用來(lái)修飾方法或類:

  • 修飾方法:只能應(yīng)用到 public 方法上,否則不生效
  • 修飾類:表明該注解對(duì)該類中所有的 public 方法都生效

5.2??@Transactional 參數(shù)說(shuō)明

接下來(lái),我們?cè)O(shè)置在發(fā)生算數(shù)異常時(shí),不進(jìn)行回滾:

@Slf4j
@RequestMapping("/trans2")
@RestController
public class TransactionalController2 {@Autowiredprivate UserService userService;@Transactional(noRollbackFor = ArithmeticException.class)@RequestMapping("/addUser")public Integer addUser(String username,String password){User user = new User(username,password);Integer result = userService.insert(user);log.info("影響行數(shù):"+result);int a = 10/0;return result;}
}

?接下來(lái)我們手動(dòng)扔出異常:

@Slf4j
@RequestMapping("/trans2")
@RestController
public class TransactionalController2 {@Autowiredprivate UserService userService;/*** 指定異常回滾* @param username* @param password* @return*/@Transactional@RequestMapping("/addUser2")public Integer addUser2(String username,String password) throws Exception {User user = new User(username,password);Integer result = userService.insert(user);log.info("影響行數(shù):"+result);throwException();return result;}public void throwException() throws Exception{throw new IOException();}
}

?可以看到并沒(méi)有進(jìn)行回滾。

@Transactional 默認(rèn)只在遇到運(yùn)行時(shí)異常和Error時(shí)才會(huì)回滾,非運(yùn)行時(shí)異常不回滾,即 Exception 的子類中,除了 RuntimeException 及其子類。

顯式的指定所有異常均需回滾:

@Slf4j
@RequestMapping("/trans2")
@RestController
public class TransactionalController2 {@Autowiredprivate UserService userService;/*** 指定異?;貪L* @param username* @param password* @return*/@Transactional(rollbackFor = Exception.class)// 顯式的指定所有異常均需要回滾@RequestMapping("/addUser2")public Integer addUser2(String username,String password) throws Exception {User user = new User(username,password);Integer result = userService.insert(user);log.info("影響行數(shù):"+result);throwException();return result;}public void throwException() throws Exception{throw new IOException();}
}

可以看到事務(wù)進(jìn)行了回滾:

?如果異常被捕獲,事務(wù)不會(huì)回滾:

@Slf4j
@RequestMapping("/trans2")
@RestController
public class TransactionalController2 {@Autowiredprivate UserService userService;@Transactional@RequestMapping("/addUser3")public Integer addUser3(String username,String password) throws Exception {User user = new User(username,password);Integer result = userService.insert(user);log.info("影響行數(shù):"+result);try{int a = 10/0;}catch (Exception e){e.printStackTrace();}return result;}
}

可以看到事務(wù)沒(méi)有回滾,正常提交:?

5.3??@Transactional 工作原理

@Transactional 是基于 AOP 實(shí)現(xiàn)的,AOP 又是使用動(dòng)態(tài)代理實(shí)現(xiàn)的。如果目標(biāo)對(duì)象實(shí)現(xiàn)了接口,默認(rèn)情況下會(huì)采用?JDK 的動(dòng)態(tài)代理,如果目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)了接口,會(huì)使用?CGLIB 動(dòng)態(tài)代理。
@Transactional 在開(kāi)始執(zhí)行業(yè)務(wù)之前,通過(guò)代理先開(kāi)啟事務(wù),在執(zhí)行成功之后再提交事務(wù)。如果中途到異常,則回滾事務(wù)。

http://www.risenshineclean.com/news/53982.html

相關(guān)文章:

  • 微信網(wǎng)站開(kāi)發(fā)有中院管轄呢網(wǎng)站制作公司網(wǎng)站
  • 企業(yè)網(wǎng)站服務(wù)器建設(shè)方法最好的網(wǎng)站推廣軟件
  • 網(wǎng)站制作網(wǎng)址網(wǎng)絡(luò)推廣方法怎么做
  • 南京網(wǎng)站建設(shè)公司 w搜索引擎優(yōu)化專員
  • 國(guó)外網(wǎng)站做色情主播app拉新推廣接單平臺(tái)
  • 福州綜合網(wǎng)站建設(shè)慧生活798app下載
  • 金華網(wǎng)站建設(shè)哪里好百度權(quán)重域名
  • 公司網(wǎng)站建設(shè)怎么計(jì)費(fèi)網(wǎng)絡(luò)推廣員工作好做嗎
  • alexa排名全球前50網(wǎng)站排名優(yōu)化方案
  • 交河做網(wǎng)站價(jià)格windows優(yōu)化大師可靠嗎
  • 如何承接設(shè)計(jì)網(wǎng)站建設(shè)傳媒網(wǎng)站
  • 諸城做網(wǎng)站的公司php視頻轉(zhuǎn)碼
  • 在線直播網(wǎng)站怎么做人民網(wǎng)輿情數(shù)據(jù)中心官網(wǎng)
  • 國(guó)外大型網(wǎng)站曹操seo博客
  • 酒泉做網(wǎng)站網(wǎng)站目錄結(jié)構(gòu)
  • 門戶網(wǎng)站建設(shè)工作方案在線優(yōu)化seo
  • 深圳市建設(shè)科技促進(jìn)中心網(wǎng)站網(wǎng)絡(luò)優(yōu)化網(wǎng)站
  • 做網(wǎng)站的例子設(shè)計(jì)網(wǎng)站官網(wǎng)
  • 佛山門戶網(wǎng)站建設(shè)廣告優(yōu)化師怎么學(xué)
  • 做日語(yǔ)字幕的網(wǎng)站杭州關(guān)鍵詞排名系統(tǒng)
  • 做vi的網(wǎng)站廣告門
  • 廣告設(shè)計(jì)圖片 門頭windows優(yōu)化大師有用嗎
  • 零度業(yè)務(wù)網(wǎng)站seo學(xué)校培訓(xùn)班
  • 自己做網(wǎng)站要買域名嗎谷歌seo網(wǎng)站推廣怎么做
  • 網(wǎng)站用微信登錄 要怎么做東莞網(wǎng)站優(yōu)化關(guān)鍵詞排名
  • 鄭州企業(yè)網(wǎng)站開(kāi)發(fā)信陽(yáng)seo推廣
  • 南寧網(wǎng)站設(shè)計(jì)推廣在線網(wǎng)頁(yè)服務(wù)器
  • 正能量網(wǎng)站推薦免費(fèi)下載名詞解釋seo
  • 網(wǎng)站做的圖上傳后字變得很模糊win7一鍵優(yōu)化工具
  • 上海成品網(wǎng)站google推廣一年的費(fèi)用