事务的基本要素:

  原子性(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. 解决mxGraph放大/缩小在非IE浏览器下overlay图标位置不变化的问题

    首先要创建一个工具栏.并为工具栏中的放大.缩小button定义事件. <div id="toolbar" style="float:left;margin-top: ...

  2. activity 生命周期 http://stackoverflow.com/questions/8515936/android-activity-life-cycle-what-are-all-these-methods-for

    331down voteaccepted See it in Activity Lifecycle (at Android Developers). onCreate(): Called when t ...

  3. vue-devtools工具的安装

    vue-devtools是一款基于chrome游览器的插件,用于调试vue应用,这可以极大地提高我们的调试效率.接下来我们就介绍一下vue-devtools的安装 1.登录github,获取到vue- ...

  4. Activiti6.0 java项目框架 spring5 SSM 工作流引擎 审批流程

    工作流模块----------------------------------------------------------------------------------------------- ...

  5. JavaScript 正则表达式-严格匹配

    创建语法 var pattern = /test/;   或者  var pattern =  new RegExp("test"); 可配合使用以下三个标志 1) .i  可以使 ...

  6. 关于正则表达式RegExp

    常用元字符串 元字符 说明 \d 匹配   数字 \D 匹配   非数字 \w 匹配   数字,字母,下划线 \W 匹配   任意不是字母,数字,下划线 \s 匹配   空白符 \S 匹配   任意不 ...

  7. elasticsearch 深入 —— Top Hits Aggregation

    Top Hits Aggregation top_hits指标聚合器跟踪正在聚合的最相关文档. 此聚合器旨在用作子聚合器,以便可以按桶聚合最匹配的文档. top_hits聚合器可以有效地用于通过桶聚合 ...

  8. HTML基础 块级元素和内联元素

    大多数 HTML 元素被定义为块级元素或内联元素. 块级元素包括:body  from  select  textarea  h1-h6 html table  button  hr  p  ol   ...

  9. mysql 联合表查询从表即使有索引依然ALL的一个原因

    那就是主表和从表的关联字段的编码方式不一样!!! 晕啊,折腾了半天才发现,可能是不知道啥时候mysql更改主体编码方式了,结果导致后来新建的表的关联字段和之前的主表的字段的编码方式不一样 改成一样的编 ...

  10. MySQL Authentication plugin 'caching_sha2_password' cannot be loaded

    很多用户在使用Navicat Premium 12连接MySQL数据库时会出现Authentication plugin 'caching_sha2_password' cannot be loade ...