您好,登錄后才能下訂單哦!
一組業(yè)務(wù)操作ABCD,要么全部成功,要么全部不成功。
原子性:整體
一致性:完成
隔離性:并發(fā)
持久性:結(jié)果
臟讀:一個事務(wù)讀到另一個事務(wù)沒有提交的數(shù)據(jù)
不可重復(fù)讀:一個事務(wù)讀到另一個事務(wù)已提交的數(shù)據(jù)(update)
虛讀(幻讀):一個事務(wù)讀到另一個事務(wù)已提交的數(shù)據(jù)(insert)
read uncommitted:讀未提交。
read committed:讀已提交。解決臟讀。
repeatable read:可重復(fù)讀。解決:臟讀、不可重復(fù)讀。
serializable :串行化。都解決,單事務(wù)。
1)PlatformTransactionManager
平臺事務(wù)管理器,spring要管理事務(wù),必須使用事務(wù)管理器進(jìn)行事務(wù)配置時,必須配置事務(wù)管理器。
2)TransactionDefinition
事務(wù)詳情(事務(wù)定義、事務(wù)屬性),spring用于確定事務(wù)具體詳情,
例如:隔離級別、是否只讀、超時時間 等
進(jìn)行事務(wù)配置時,必須配置詳情。spring將配置項(xiàng)封裝到該對象實(shí)例。
3)TransactionStatus
事務(wù)狀態(tài),spring用于記錄當(dāng)前事務(wù)運(yùn)行狀態(tài)。例如:是否有保存點(diǎn),事務(wù)是否完成。
spring底層根據(jù)狀態(tài)進(jìn)行相應(yīng)操作。
PROPAGATION_REQUIRED , required , 必須 【默認(rèn)值】
支持當(dāng)前事務(wù),A如果有事務(wù),B將使用該事務(wù)。
如果A沒有事務(wù),B將創(chuàng)建一個新的事務(wù)。
PROPAGATION_SUPPORTS ,supports ,支持
支持當(dāng)前事務(wù),A如果有事務(wù),B將使用該事務(wù)。
如果A沒有事務(wù),B將以非事務(wù)執(zhí)行。
PROPAGATION_MANDATORY,mandatory ,強(qiáng)制
支持當(dāng)前事務(wù),A如果有事務(wù),B將使用該事務(wù)。
如果A沒有事務(wù),B將拋異常。
PROPAGATION_REQUIRES_NEW , requires_new ,必須新的
如果A有事務(wù),將A的事務(wù)掛起,B創(chuàng)建一個新的事務(wù)
如果A沒有事務(wù),B創(chuàng)建一個新的事務(wù)
PROPAGATION_NOT_SUPPORTED ,not_supported ,不支持
如果A有事務(wù),將A的事務(wù)掛起,B將以非事務(wù)執(zhí)行
如果A沒有事務(wù),B將以非事務(wù)執(zhí)行
PROPAGATION_NEVER ,never,從不
如果A有事務(wù),B將拋異常
如果A沒有事務(wù),B將以非事務(wù)執(zhí)行
PROPAGATION_NESTED ,nested ,嵌套
A和B底層采用保存點(diǎn)機(jī)制,形成嵌套事務(wù)。
掌握:PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
money INT
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO account(username,money) VALUES('jack','10000');
INSERT INTO account(username,money) VALUES('rose','10000');
SELECT * FROM account;
該配置用于測試事務(wù)的手動管理。
/**
* 事物管理器
*/
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager (DruidDataSource dataSource){
LOGGER.info("【transactionManager 初始化...】");
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
/**
* 創(chuàng)建事物手動管理模板
*/
@Bean(name = "transactionTemplate")
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager)
LOGGER.info("【transactionTemplate 初始化...】");
TransactionTemplate transactionTemplate = new TransactionTemplate() ;
transactionTemplate.setTransactionManager(transactionManager);
return transactionTemplate;
}
接口方法
public interface AccountService {
/**
* 匯款
*/
void out (String outer , Integer money);
/**
* 收款
*/
void in (String inner , Integer money);
}
接口實(shí)現(xiàn)
@Service
public class AccountServiceImpl implements AccountService {
@Resource
private JdbcTemplate jdbcTemplate ;
public void out(String outer, Integer money) {
String sql = "update account set money = money - ? where username = ?";
jdbcTemplate.update(sql, money,outer);
}
public void in(String inner, Integer money) {
String sql = "update account set money = money + ? where username = ?";
jdbcTemplate.update(sql, money,inner);
}
}
測試接口
public interface TradeService {
/**
* 轉(zhuǎn)賬交易:沒有事務(wù)管理
*/
void trade1(String outer ,String inner ,Integer money);
/**
* 轉(zhuǎn)賬交易:手動管理事務(wù)
*/
void trade2(String outer ,String inner ,Integer money);
/**
* 轉(zhuǎn)賬交易:注解管理事務(wù)
*/
void trade3(String outer ,String inner ,Integer money);
}
接口實(shí)現(xiàn)
@Service
public class TradeServiceImpl implements TradeService {
@Resource
private AccountService accountService ;
@Resource
private TransactionTemplate transactionTemplate ;
@Override
public void trade1(String outer, String inner, Integer money) {
accountService.out(outer, money);
// 拋出異常
int i = 1/0;
accountService.in(inner, money);
}
@Override
public void trade2(String outer, String inner, Integer money) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
public void doInTransactionWithoutResult(TransactionStatus arg0) {
accountService.out(outer, money);
// 拋出異常
int i = 1/0;
accountService.in(inner, money);
}
});
}
@Transactional(value="transactionManager",propagation= Propagation.REQUIRED)
@Override
public void trade3(String outer, String inner, Integer money) {
accountService.out(outer, money);
// 拋出異常
int i = 1/0;
accountService.in(inner, money);
}
}
@RunWith(SpringJUnit4Cla***unner.class)
@SpringBootTest(classes = TransactionApplication.class)
public class TradeTest {
@Resource
private TradeService tradeService ;
/**
* 沒有事務(wù)管理
* jack 減少了1000塊錢,但是rose得到1000塊錢
* 1 jack 9000
* 2 rose 10000
*/
@Test
public void testTrade1 (){
tradeService.trade1("jack", "rose", 1000);
}
/**
* 手動管理事務(wù)
* 1 jack 10000
* 2 rose 10000
*/
@Test
public void testTrade2 (){
tradeService.trade2("jack", "rose", 1000);
}
/**
* 注解管理事務(wù)
* 1 jack 10000
* 2 rose 10000
*/
@Test
public void testTrade3 (){
tradeService.trade3("jack", "rose", 1000);
}
}
GitHub地址:知了一笑
https://github.com/cicadasmile
碼云地址:知了一笑
https://gitee.com/cicadasmile
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。