深圳网站建设推广平台,emlog做企业网站,餐饮网站方案,wordpress布局 插件一、数据库的事物的基本特性
事物是区分文件存储系统与Nosql数据库重要特性之一#xff0c;其存在的意义是为了保证即使在并发情况下也能正确的执行crud操作。怎样才算是正确的呢#xff1f;这时提出了事物需要保证的四个特性即ACID#xff1a;
A: 原子性(atomicity) 事物…一、数据库的事物的基本特性
事物是区分文件存储系统与Nosql数据库重要特性之一其存在的意义是为了保证即使在并发情况下也能正确的执行crud操作。怎样才算是正确的呢这时提出了事物需要保证的四个特性即ACID
A: 原子性(atomicity) 事物中各项操作要么全做要么全不做任何一项操作的失败都会导致整个事物的失败C: 一致性(consistency) 事物结束后系统状态是一致的I: 隔离性(isolation) 并发执行的事物彼此无法看到对方的中间状态D: 持久性(durability) 事物完成后所做的改动都会被持久化即使发生灾难性的失败。
在高并发的情况下要完全保证其ACID特性是非常困难的除非把所有的事物串行化执行但带来的负面的影响将是性能大打折扣。很多时候我们有些业务对事物的要求是不一样的所以数据库中设计了四种隔离级别供用户基于业务进行选择。
二、数据库的事物的隔离级别 隔离级别 脏读Dirty Read 不可重复读NonRepeatable Read 幻读Phantom Read 未提交读Read uncommitted 可能 可能 可能 已提交读Read committed 不可能 可能 可能 可重复读Repeatable read 不可能 不可能 可能 可串行化SERIALIZABLE 不可能 不可能 不可能 脏读 :
一个事物读取到另一事物未提交的更新数据
不可重复读 :
在同一事物中,多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事物已提交的更新数据. 相反, “可重复读”在同一事物中多次读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事物已提交的更新数据。
幻读 : 查询表中一条数据如果不存在就插入一条并发的时候却发现里面居然有两条相同的数据。这就幻读的问题。 数据库默认隔离级别
Oracle中默认级别是 Read committed
mysql 中默认级别 Repeatable read。另外要注意的是mysql 执行一条查询语句默认是一个独立的事物所以看上去效果跟Read committed一样。
# 查看mysql 的默认隔离级别
SELECT tx_isolation 三、事物的传播机制 类别 事物传播类型 说明 支持当前事物 PROPAGATION_REQUIRED 必须的 如果当前没有事物就新建一个事物如果已经存在一个事物中加入到这个事物中。这是最常见的选择。 PROPAGATION_SUPPORTS 支持 支持当前事物如果当前没有事物就以非事物方式执行。 PROPAGATION_MANDATORY 强制 使用当前的事物如果当前没有事物就抛出异常。 不支持当前事物 PROPAGATION_REQUIRES_NEW (隔离) 新建事物如果当前存在事物把当前事物挂起。 PROPAGATION_NOT_SUPPORTED (不支持) 以非事物方式执行操作如果当前存在事物就把当前事物挂起。 PROPAGATION_NEVER (强制非事物) 以非事物方式执行如果当前存在事物则抛出异常。 套事物 PROPAGATION_NESTED 嵌套事物 如果当前存在事物则在嵌套事物内执行。如果当前没有事物则执行与PROPAGATION_REQUIRED类似的操作。
常用事物传播机制
PROPAGATION_REQUIRED 这个也是默认的传播机制PROPAGATION_NOT_SUPPORTED 可以用于发送提示消息站内信、短信、邮件提示等。不属于并且不应当影响主体业务逻辑即使发送失败也不应该对主体业务逻辑回滚。PROPAGATION_REQUIRES_NEW 总是新启一个事物这个传播机制适用于不受父方法事物影响的操作比如某些业务场景下需要记录业务日志用于异步反查那么不管主体业务逻辑是否完成日志都需要记录下来不能因为主体业务逻辑报错而丢失日志