mysql jdbc事务隔离级别_MySQL事务的四种隔离级别

事务的基本要素:

原子性(atomicity):事务开始后的全部操作, 要么全部执行成功,如果中间出现错误,事务回滚到事务开始前的状态.

一致性(Consistency):事务开始后,数据库的完整性约束没有被破坏.例如:A向B转账,A扣除了金额,B却没收到

隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同事务之间没有彼此没有干扰.

持久性(Durability):事务完成后,事务对数据库的所有更新都保留到数据库,不能进行回滚.

事务并发问题

脏读:事务A读取了事务B更新的数据, 事务B进行回滚.事务A读取到的数据就是脏数据

不可重复读取:事务A多次读取同一数据,事务B在事务A多次读取过程中,对数据多次更新并提交,导致事务A多次读取同一数据,结果不一致

幻读:系统管理员对数据库中的所有学生成绩从具体分数改变为ABCD等级,系统管理原B添加一条学生的具体分数.系统管理原A改完后发现还有一条数据没有改过来,就好像发生幻觉一样.

小结:

不可重复读取重于修改,取解决锁住满足条件的行.幻读重于插入和删除,解决锁住表

MySQL事务隔离级别

事务隔离级别

脏读

不可重复读取

幻读

读取未提交(read-uncommitted)

不可重复读取(read-committed)

可重复读取(repeatable-read)

串行化(serializable)

mysql默认事务隔离级别为:可重复读取(reeatable-read)

spring中事务管理

事务抽象

提供了一致的事务模型(JDBC/Hibernate/mybatis/dataSource/JTA)

事务接口

PlatformTransactionManager

DataSourceTransactionManager

HibernateTransactionManager

JtaTransactionManager

事务相关方法

void commit(TransactionStatus status) throws TransactionException;

voidrollback(TransactionStatus status) throwsTransactionException;

TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throwsTransactionException;

定义事务相关

TransactionDefinition

属性:

Propagation(传播方式)

Isolation(隔离)

Timeout

Read-only status (true or false)

自定义事务:

// 其中 dataSource 框架会自动为我们注入

@Bean(name = "MyTransaction")

public PlatformTransactionManager txManager(@Qualifier("MyDataSource") DataSource dataSource) {

return new DataSourceTransactionManager(dataSource);

}

传播特性

传播性

描述

PROPAGATION_required

0

当前有事务就用, 没有事务就新建一个事务(默认)

PROPAGATION_supports

1

事务可有可无,不是必须的

PROPAGATION_mandatory

2

当前一定要有事务,不然就抛出异常

PROPAGATION_REQUIRED_NEW

3

无论是否有事务,都创建一个新事务

PROPAGEATION_NOT_SUPPORTS

4

不支持事务,按照非事务方式进行

PROPAGEATION_NAVER

5

不支持事务,如果有事务则抛出异常

PROPAGEATION_NESTED

6

当前有事务就在当前事务内在起一个事务,内部事务不影响外部事务

事务隔离特性

隔离性

脏读

不可重复读取

幻读

ISOLATION_READ_UNCOMMITTED (未提交)

1

ISOLATION_READ_COMMITTED(不可重复读取)

2

×

ISOLATION_REPEATABLE_READ(可重复读取)

3

×

×

ISOLATION_SERIAILZABLE(串行化)

4

×

×

×

编程式事务

可以使用transactionTeamplate,如果有返回值的可以使用TransactionCallback,没有返回值可以使用TransactionCallbackWithoutResult.

@SpringBootApplication

@Slf4j

public class ProgrammaticTransactionDemoApplication implements CommandLineRunner {

@Autowired

private TransactionTemplate transactionTemplate;

// 如果没有配置数据源, spring boot 自动注入默认数据库DB2

@Autowired

private JdbcTemplate jdbcTemplate;

public static void main(String[] args) {

SpringApplication.run(ProgrammaticTransactionDemoApplication.class, args);

}

@Override

public void run(String... args) throws Exception {

log.info("事务开启前数据库数据数量 {}", getCount());

// 执行事务

transactionTemplate.execute(new TransactionCallbackWithoutResult() {

@Override

protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {

// jdbc执行sql语句

jdbcTemplate.execute("INSERT INTO FOO (ID, BAR) VALUES (1, 'aaa')");

log.info("执行sql后数据库数据数量 {}", getCount());

// 事务进行回滚

transactionStatus.setRollbackOnly();

}

});

log.info("事务回滚后数据库数据数量", getCount());

}

// 查询数据库数据数量

private long getCount() {

return (long) jdbcTemplate.queryForList("SELECT COUNT(*) AS CNT FROM FOO")

.get(0).get("CNT");

}

}

执行结果:

事务开启前数据库数据数量 0

执行sql后数据库数据数量 1

事务回滚后数据库数据数量 0

声明式事务:

spring 声明式事务式事务是利用AOP的proxy,在目标方法上进行封装,帮助用户进行模板式事务操作

基于注解的配置

开启事务的方式:

添加@EnableTransactionManagement注解:

参数

proxyTargetClass (代理目标类)

proxyTargetClass 值说明:

@EnableTransactionManagement(proxyTargetClass = true) //使用CGLIB代理方式增强

没有定义接口只有实现方法时都思源CGLIB进行代理(增强方法)

有定义接口,并实现接口

true: 使用CGLIB进行代理

false:使用JDK动态代理机制(代理所有实现了的接口)

model: 默认使用@EnableTransactionManagement(mode = AdviceMode.PROXY).

order:指定事务AOP拦截顺序,默认时最低优先级,保证所有的事务在启动后都可以执行

@Transactional的使用

属性

transactionManager 指定事务 实例:@Transactional(transactionManager = "MyTransaction")

propagation 传播特性

isolation 隔离机制

timeout 超时

readOnly 是否只读

怎么判断回滚, 碰到特定异常的时候进行回滚,示例:@Transactional(rollbackFor=RollbackException.class)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值