事务的基本要素:

  原子性(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;

   void rollback(TransactionStatus status) throws TransactionException;

  TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;

  定义事务相关

   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)

MySQL事务的四种隔离级别的更多相关文章

  1. 数据库操作事物的四大特性以及MySQL数据库的四种隔离级别

    1 .事物操作数据库的四大特性(ACID) 1.原子性 (Atomicity) 原子性:就是事物的所包含的所有操作,要么全部成功,要么全部失败回滚. 2.一致性 (Consistency) 一致性:简 ...

  2. SQL事务的四种隔离级别和MySQL多版本并发控制

      SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的那些改变时可见的,那些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. ReadUncommitted( ...

  3. sql 事务的四种隔离级别

    在 SQL 标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. read unco ...

  4. SQL Server事务的四种隔离级别

    在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些是在事务内和事务间可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. 1.未提交读(Read ...

  5. mysql ACID与四种隔离级别归纳总结

    关于数据库的ACID特性已经有很多的介绍,这里再重新归纳总结一下:   A(atomicity)原子性: 即事务要么全部做完,要么全部不做,不会出现只做一部分的情形,如A给B转帐,不会出现A的钱少了, ...

  6. msyql事务的四种隔离级别

    一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...

  7. SQL事务的四种隔离级别

    1未提交读(Read uncommitted):完全不锁表,所以会出现脏数据.2提交读(Read committed):1.事务1中update才锁表,可以select到最新数据. 事务2select ...

  8. 数据库事务 ACID属性、数据库并发问题和四种隔离级别

    数据库事务 ACID属性.数据库并发问题和四种隔离级别 数据库事务 数据库事务是一组逻辑操作单元,使数据从一种状态变换到另一种状态 一组逻辑操作单元:一个或多个DML操作 事务处理原则 保证所有事务都 ...

  9. 【转载】mysql 四种隔离级别分析

    sql标准中,有四种隔离级别,各个离级别都有各自的规则,隔离级别越低,允许并发越大,消耗的资源越少,但是越不安全,下面就mysql数据库来分别介绍一下(每个存储引擎实施的隔离级别会有稍微的不同)mys ...

随机推荐

  1. 【记录】eclipse jar包看不了源码

    第一步:下载JAD . jad官方地址的官方下载地址是: http://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasem ...

  2. linux性能分析工具Procs

  3. rabbitmq路由规则

    信道如何共用???? 几台机器共用一个channel 如何做到?

  4. rabbiitmq非阻塞调用

    https://blog.csdn.net/panxianzhan/article/details/50755409 https://blog.csdn.net/u013946356/article/ ...

  5. 笔记--NS_SWIFT_NAME与@objc区别与用途

    swift中使用Selector经常要在方法前面添加@objc,除了默认的@objc,其实我们还可以添加自己制定的swift中调用的函数名 @objc(pushToControllerName:par ...

  6. 4.VUE前端框架学习记录四:Vue组件化编码2

    VUE前端框架学习记录四:Vue组件化编码2文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...

  7. python模块之jinja2 ,shutil

    一 jinja2 用来给python提供html语法的模块 安装 pip install jinja2 使用 from jinja2 import Template def html_output(p ...

  8. 人生苦短_我用Python_Try_Exception异常捕捉_007

    # coding=utf-8 ''' request+try__异常处理 ''' import requests class HttpRequests: def __init__(self, url, ...

  9. JS中JSON.stringify()方法,将js对象(json串)转换成字符串,传入服务器

    JSON 通常用于与服务端交换数据. 在向服务器发送数据时一般是字符串. 我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符串. 语法 JSON.string ...

  10. 网云穿-SpringBoot项目映射外网

    网云穿-最简单易用的内网穿透软件,最简洁教程一键穿透网站.数据库.远程桌面 网云穿,致力于打造最便捷的「内网穿透」应用 https://xiaomy.net/index.html  网云穿是一款可以在 ...