Mysql事务隔离级别和传播机制
Mysql事务隔离级别和传播机制
js插件加密⼀、事务的特性(ACID)
1. 原⼦性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执⾏过程中出错,会回滚
到事务开始前的状态,所有的操作就像没有发⽣⼀样。也就是说事务是⼀个不可分割的整体,就像化学中学过的原⼦,是物质构成的基本单位。
2. ⼀致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。⽐如A向B转账,不可能A扣了钱,B却没收到。
3. 隔离性(Isolation):同⼀时间,只允许⼀个事务请求同⼀数据,不同的事务之间彼此没有任何⼲扰。⽐如A正在从⼀张银⾏卡中取rotation中文
钱,在A取钱的过程结束前,B不能向这张卡转账。
4. 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
⼆、事务的并发问题
1. 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
阮一峰es6标准入门目录2. 不可重复读:事务 A 多次读取同⼀数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同⼀数据
时,结果不⼀致。
3. 幻读:系统管理员A将数据库中所有学⽣的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插⼊了⼀条具体分数的
记录,当系统管理员A改结束后发现还有⼀条记录没有改过来,就好像发⽣了幻觉⼀样,这就叫幻读。
⼩结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满⾜条件的⾏,解决幻读需要锁表
三、事务的隔离级别
1. ISOLATION_DEFAULT:这是⼀个PlatfromTransactionManager默认的隔离级别,使⽤数据库默认的事务隔离级别。每种数据库的默
认隔离级别是不同的,例如SQL Server、Oracle默认Read Commited,MySQL默认Repeatable Read。另外四个与JDBC的隔离级别相对应,不同的隔离级别采⽤不同的锁类型来实现,在四种隔离级别中,Serializable的隔离级别最⾼,Read Uncommited的隔离级别最低。
2. ISOLATION_READ_UNCOMMITTED:读未提交数据,这是事务最低的隔离级别,在并发的事务中,它充许⼀个事务可以读到另⼀
图片动画css个事务未提交的更新数据。(会出现脏读,不可重复读和幻读)
3. ISOLATION_READ_COMMITTED:读已提交数据,保证在并发的事务中,⼀个事务修改的数据提交后才能被另外⼀个事
务读取到。(会出现不可重复读和幻读)
4. ISOLATION_REPEATABLE_READ:可重复读,这种事务隔离级别可以防⽌脏读,不可重复读。但是可能出现幻读。⼀般
是采⽤“快照”的⽅式来实现的。
5. ISOLATION_SERIALIZABLE:事务被处理为顺序执⾏。这是花费最⾼,但也是最可靠的事务隔离级别。能有效的避免脏读、
不可重复读、幻读。
四、事务的传播属性
1. PROPAGATION_REQUIRED:⽀持当前事务,如果当前没有事务,就新建⼀个事务。也就是说业务⽅法需要在⼀个事务中运⾏,如mysql面试题acid
果业务⽅法被调⽤时,调⽤业务⽅法的⾏为(⽅法)已经处在⼀个事务中,那么就加⼊到该事务,否则为⾃⼰创建⼀个新的事务。
(默认传播属性)
2. PROPAGATION_SUPPORTS:⽀持当前事务,如果当前没有事务,就以⾮事务⽅式执⾏。也就是说如果业务⽅法在某个事务范围内
被调⽤,则该⽅法成为该事务的⼀部分。如果业务⽅法在事务范围外被调⽤,则该⽅法在没有事务的环境下执⾏。
3. PROPAGATION_MANDATORY:⽀持当前事务,如果当前没有事务,就抛出异常。也就是说业务⽅法只能在⼀个已经存在的事务中
执⾏,业务⽅法不能发起⾃⼰的事务。如果业务⽅法在没有事务的环境下被调⽤,容器就会抛出例外。quartus
4. PROPAGATION_REQUIRESNEW:新建事务,如果当前存在事务,把当前事务挂起。也就是说业务⽅法被调⽤时,不管是否已经存
在事务,业务⽅法总会为⾃⼰发起⼀个新的事务。如果调⽤业务⽅法的⾏为(⽅法)已经运⾏在⼀个事务中,则原有事务会被挂起,新的事务
会被创建,直到业务⽅法执⾏结束,新事务才算结束,原先的事务才会恢复执⾏。
5. PROPAGATION_NOT_SUPPORTED:以⾮事务⽅式执⾏,如果当前存在事务,就把当前事务挂起。也就是说业务⽅法不需要事
务。如果⽅法没有被关联到⼀个事务中,容器不会为它开启事务。如果⽅法在⼀个事务中被调⽤,该事务会被挂起,在⽅法调⽤结束后,原先的事务便会恢复执⾏。
6. PROPAGATION_NEVER:以⾮事务⽅式执⾏,如果当前存在事务,则抛出异常。也就是说业务⽅法绝对不能在事务范围内执⾏。如
果业务⽅法在某个事务中执⾏,容器会抛出例外,只有业务⽅法没有关联到任何事务,才能正常执⾏。
7. PROPAGATION_NESTED:如果⼀个活动的事务存在,则运⾏在⼀个嵌套的事务中。如果没有活动事务, 则按REQUIRED属性执
⾏。它使⽤了⼀个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论