学习内容来自b站江南一点雨
事务
ACID:
原子性(要么全完成,要么全回滚)
一致性(事务执行前后数据库完整性不会被破坏)
隔离性(允许多个并发事务同时对数据修改、读写)
持久性(数据处理结束后对数据库的修改是永久的)
MySQL事务–隔离级别
分为四种,即
序列化/串行化Serializable:只有一个事务可以执行,多个用户顺序执行事务;最安全,效率低
可重复读Repeatable read(mysql默认):当前事务处理期间,变化不能被其他用户看到;自己查的时候,提交事务之前,不管别人怎么改数据、怎么提交,我自己看到的数据都是不变的 --幻读
提交读Read committed:可以读到别人提交后的数据 --幻读(别人要插入的数据跟我要加的数据冲突了,别人还没提交,我这一直卡着)、不可重复读
未提交读Read uncommitted:能读到别人没提交的数据 --幻读(查数据的时候有某条数据,但是删不掉,因为别人还没提交)、不可重复读、脏读(读到别人修改、没提交的数据,别人回滚了我查的数据不对了)
解决了以下问题:
脏读(读了别人修改、没提交的数据)
不可重复读(在一个事务内,读表中某一行数据,多次读结果不同;读了别人 提交 前后的数据)
幻读(一个事务内,多次读,结果集个数不一样)
√: 可能出现 ×: 不会出现
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | × | √ |
Serializable | × | × | × |
随着隔离级别增加,性能降低
查询事务隔离级别
方法一:命令行连接数据库,用“show variables like ‘tx_isolation’;”
-- 8之前
show variables like 'tx_isolation';
-- 8之后
show variables like 'transaction_isolation';
方法二:“SELECT @@tx_isolation;”
SELECT @@tx_isolation;
SELECT @@transaction_isolation;
全局查询在@@后加global.
修改事务隔离级别
set session transaction isolation level 要设置的隔离级别;
使用事务
开启事务–执行SQL–事务提交
start transaction;
-- SQL语句;
commit;
Spring中的事务
三大基础组件
1.PlatformTransactionManager 事务处理的核心
getTransaction(); 根据传入的事务设置对象(TransactionDefinition)创建事务对象
commit();事务提交
rollback();事务回滚
2.TransactionDefinition 事务定义(定义事务的属性、规则)
五条主要规则:隔离性、传播性、回滚规则、超时时间、事务是否只读
3.TransactionStatus 事务状态 (事务的本身)
查看当前事务是否是新事务、是否有savepoint
flush(); 刷新
编程式事务
不常用,使用步骤:
1.创建项目,导入依赖,配置包扫描
2.配置数据源,提供事务管理器transactionManager,配置JDBCTemplate 或配置TransactionTemplate,JDBCTemplate
<!--配置数据源-->
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
<property name="password" value="root"/>
<property name="username" value="root"/>
<property name="url" value="jdbc:mysql://test?serverTimezone=Asia/shanghai"/>
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
</bean>
<!--提供事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置TransactionTemplate-->
<bean class="org.springframework.transaction.support.TransactionTemplate" id="transactionTemplate">
<property name="transactionManager" ref="transactionManager