数据库事物

数据库事物,第1张

@Transaction(propagation="REQUIRED")  
  事物的传播特性
  是指多个事物方法在相互调用时,事物如何在这些方法传播(默认是REQUIRED)
  
  1.REQURED
    要求当前事物方法必须在事物中,存在事物则加入事物、没有则创建
 
    SUPPORTS(1),
    MANDATORY(2),    必须在事务中运行,如果当前事务不存在,则会抛出一个异常。不会主动开启一个事务
    REQUIRES_NEW(3),
    NOT_SUPPORTED(4), 不应该运行在事务中,如果存在当前事务,在该方法运行期间,当前事务将被挂起
    NEVER(5),         已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚
    NESTED(6);
    
  2.事物的ACID 特性 
    【1.原子性
    
    【2.隔离型:2个事物的执行都是独立隔离开来的,当多事物 *** 作同一个对象时会以串行等待的方式保证事物之间是隔离开来的
    
    【3.一致性:执行成功则整体成功,不然整体回到事物前的状态
    
    【4.持久性:一旦执行成功,不会丢失
    
  3.事物并发与事物隔离
     事物的隔离是通过锁来实现的,一个事物对数据进行修改时,会对数据加锁,只有该事物提交后,其他事物才能进行加锁
     
     事物并发问题与事物的隔离级别(不同的隔离级别 解决不同问题)
     
     【1.READ_UNCOMMITED, 防止了脏写,事物对数据进行修改时,会加写锁,其他事物无法获取锁阻塞
     
     【2.REDA_COMMITED,防止了脏读,2个事物并发执行,一个修改已经加写锁成功,另一个加读锁(REDA_COMMIt)就会失败则阻塞等待。
                     读锁读取数据结束后就会释放锁(事物还未结束)
     
     【3.REPEATABLE_READ ,防止了不可重发读。在事物并发的时,在一个事物中多次读取数据,多次读取的结果不一样:因为READ_COMMITED 级别下,读取完事物会马上释放读锁;
                        REPEATABLE_READ 在事物结束后才释放锁
                        
     *****前面的写 *** 作,都指的是更新、删除,不包括insert 以为当时是无数据的,没法对还不存在的数据加锁
     
     【4 SERIALIZABLE  防止幻读,因为是insert ,没对表记录加锁,只能锁整张表,所有事物串行执行
                    或间隙锁可以阻止
    4. 为什么说MySQL单表数据不要超过500万行

     这是阿里测试得出的数据,其实这跟索引、硬件内存的大小有关,当表中的索引太大,内存无法全部加载时(InnoDB buffer size 足够的情况下,其能完成全加载进内,没有问题),就只能存在磁盘上,性能自然下降。

      建议:大表(数据量大、容量大)。先拆成主表(字段多)、detail表(容量高)。主表严格控制索引的质量,detail表只能用主键ID查(后期可以通过主键ID分表)
      https://www.cnblogs.com/iullor/p/12434379.html
  
  
  

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/730456.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存