MySQL(三,事务)

  • 数据库事务特点 ACID原子性,一致性,隔离性,永久性ACID是Atomic(原子性) Consistency(一致性) Isolation(隔离性) Durability(持久性)
  • 数据库事务说是如何实现的?
  1. 通过预写日志方式实现的,redo和undo机制是数据库实现事务的基础
  2. redo日志用来在断电/数据库崩溃等状况发生时重演一次刷数据的过程,把redo日志里的数据刷到数据库里,保证了事务的持久性(Durability)
  3. undo日志是事务执行失败的时候撤销对数据库的操作,保证了事务的原子性。
  • 数据库事务隔离级别
  1. 读未提交read-uncommitted:脏,不可重复读-幻读,A读取了B未提交的事务,B回滚,A出现脏读; 最低级别,以上问题均无法解决。
  2. 不可重复读read-committed:不可重复读-幻读,A只能读取B已经提交的事务,但是A还没结束,B又更新数据隐式提交,然后A又读了一次出现不可重复读; 可避免脏读情况发生。
  3. 可重复读repeatable-read<默认>-幻读,事务开启,不允许其他事务的UPDATE修改操作,A读取B已经提交的事务,然而B在该表插入新的行,之后A在读取的时候多出一行,出现幻读; 确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。
  4. 串行化serializable-最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行,可避免脏读、不可重复读、幻读情况的发生。
  • 七种事务传播行为

(1)Propagation.REQUIRED<默认> 如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。

(2)Propagation.SUPPORTS 如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。

(3)Propagation.MANDATORY 如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。

(4)Propagation.REQUIRES_NEW 重新创建一个新的事务,如果当前存在事务,延缓当前的事务。

(5)Propagation.NOT_SUPPORTED 以非事务的方式运行,如果当前存在事务,暂停当前的事务。

(6)Propagation.NEVER 以非事务的方式运行,如果当前存在事务,则抛出异常。

(7)Propagation.NESTED 如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。

  • 产生死锁的四个必要条件

(1):互斥: 资源x的任意一个时刻只能被一个线程持有

(2):占有且等待:线程1占有资源x的同时等待资源y,并不释放x

(3):不可抢占:资源x一旦被线程1占有,其他线程不能抢占x

(4):循环等待:线程1持有x,等待y,线程2持有y,等待x

当全部满足时才会死锁

  • @Transaction

底层实现是AOP,动态代理

(1):实现是通过Spring代理来实现的。生成当前类的代理类,调用代理类的invoke()方法,在invoke()方法中调用 TransactionInterceptor拦截器的invoke()方法;

(2):非public方式其事务是失效的;

(3):自调用也会失效,因为动态代理机制导致

(4)多个方法外层加入try…catch,解决办法是可以在catch里 throw new RuntimeException()来处理

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

TiDB 性能竞赛 11.16

TiDB实现了快照隔离级别的分布式事务,支持悲观锁、乐观锁,同时也解决了大事务的难点。事务是数据库的基础,提供高效的、支持完整ACID的分布式事务更是分布式数据库的立足之本。事务是数据库执行的最小单元,允许用户将多个读写操作组合为一个逻辑单元。事务需要满足原子性、一致性、隔离性和持久性,也就是ACID。数据库有多种并发控制方法,乐观并发控制(

mysql设置时区

mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0

MySQL数据库InnoDB存储引擎Log漫游(1)

作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,