MySQL事务的四种隔离级别
事务的基本要素:
原子性(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事务的四种隔离级别的更多相关文章
- 数据库操作事物的四大特性以及MySQL数据库的四种隔离级别
1 .事物操作数据库的四大特性(ACID) 1.原子性 (Atomicity) 原子性:就是事物的所包含的所有操作,要么全部成功,要么全部失败回滚. 2.一致性 (Consistency) 一致性:简 ...
- SQL事务的四种隔离级别和MySQL多版本并发控制
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的那些改变时可见的,那些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. ReadUncommitted( ...
- sql 事务的四种隔离级别
在 SQL 标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. read unco ...
- SQL Server事务的四种隔离级别
在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些是在事务内和事务间可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. 1.未提交读(Read ...
- mysql ACID与四种隔离级别归纳总结
关于数据库的ACID特性已经有很多的介绍,这里再重新归纳总结一下: A(atomicity)原子性: 即事务要么全部做完,要么全部不做,不会出现只做一部分的情形,如A给B转帐,不会出现A的钱少了, ...
- msyql事务的四种隔离级别
一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...
- SQL事务的四种隔离级别
1未提交读(Read uncommitted):完全不锁表,所以会出现脏数据.2提交读(Read committed):1.事务1中update才锁表,可以select到最新数据. 事务2select ...
- 数据库事务 ACID属性、数据库并发问题和四种隔离级别
数据库事务 ACID属性.数据库并发问题和四种隔离级别 数据库事务 数据库事务是一组逻辑操作单元,使数据从一种状态变换到另一种状态 一组逻辑操作单元:一个或多个DML操作 事务处理原则 保证所有事务都 ...
- 【转载】mysql 四种隔离级别分析
sql标准中,有四种隔离级别,各个离级别都有各自的规则,隔离级别越低,允许并发越大,消耗的资源越少,但是越不安全,下面就mysql数据库来分别介绍一下(每个存储引擎实施的隔离级别会有稍微的不同)mys ...
随机推荐
- 最小生成树,Prim算法实现
最小生成树 所谓最小生成树,就是一个图的极小连通子图,它包含原图的所有顶点,并且所有边的权值之和尽可能的小. 首先看看第一个例子,有下面这样一个带权图: 它的最小生成树是什么样子呢?下图绿色加粗的边可 ...
- Oracle 汉字占用字节数
在oracle中一个字符特别是中文字符占几个字节是与字符集有关的. 比如GBK,汉字就会占两个字节,英文1个:如果是UTF-8,汉字一般占3个字节,英文还是1个.但是一般情况下,我们都认为是 ...
- Sass Maps的函数-map-keys($map)
map-keys($map) 函数将会返回 $map 中的所有 key.这些值赋予给一个变量,那他就是一个列表.如: map-keys($social-colors); 其返回的值为: "d ...
- linux下的软链接与硬链接
在 Linux 底下的连结档有两种,一种是类似 Windows 的快捷方式功能的文件,可以让你快速的链接到目标文件(或目录);这种链接称为软链接. 另一种则是透过文件系统的 inode 连结来产生新档 ...
- 前端每日实战:53# 视频演示如何用纯 CSS 创作一个文本淡入淡出的 loader 动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ERwpeG 可交互视频 此视频是可 ...
- cmd退出python
cmd中如何退出Python (1)在命令行上输入exit() (2)在命令行上输入quit() (3)ctrl+Z 然后回车
- django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11
搭建Django2.0+Python3+MySQL5时同步数据库时报错:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 o ...
- 调试web worker (动态生成的worker)
1.在worker.js源码文件中 写下debugger关键词 2. F12打开控制台,重新刷新页面,加载worker.js文件(注意之前的缓存,chrome推荐使用 ctrl + F5 刷新) 3. ...
- [转]Windows 10 无法访问共享的解决办法大全
本文前面介绍 Windows 10 操作系统无法访问其他电脑的共享文件夹,而其他电脑访问该共享可以访问的解决办法. 简单点说就是,你的操作系统是 Win10 ,你访问不了某台电脑的共享,但是别人可以. ...
- Nmon监控服务端性能
一.安装1.查看服务器操作系统的版本信息 lsb_release -a cat /etc/*release2.下载 a.nmon下载地址:http://nmon.sourceforge.net/pmw ...