19.10.11学习日记随笔 mysql事务隔离性
一天的感悟
学习事务的处理方式,其中反想自己学过的flask 默认是开启事务的,flask_sqlalchemy每次在提交时都是需要commit,或者失败是需要rollback回滚操作的,其实python方面就不需要进行操作了,django的orm 不过需要导入事务处理的包,使用上下文with方式,当出现异常就会尝试回滚rollback
(jdbc)
在说java,使用spring的核心ioc与aop也是很容易配置事务开启的, public方法先是读取配置文件properties文件的数据库uri(用注解@value("${在配置文件中的key}"))返回数据库连接对象 注解扫描配置文件 记得在xml文件中添加<bean:context_scan (?? 应该是这么写的..忘记了) class="xxxx.xxxx.xxx">, 开启扫描模式 扫描使用注解的类和方法
<!-- 定义数据源Bean,使用C3P0数据源实现,并注入数据源的必要信息 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSrouce"
destroy-method="close"
driverClass="com.mysql.jdbc.Driver"
jdbcUrl="jdbc:mysql://localhost/test"
user="root"
password=""
maxPoolSize="40"
minPoolSize="2"
initialPoolSize="2"
maxIdleTime="30" />
<!-- 配置JDBC数据源的局部数据管理器,使用DataSourceTransactionManager类 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
dataSource-ref="dataSource" />
之后配置事务管理器,不管xml还是注解配置 ,基本都是一个transaction实例对象,其中实例对象需要datarouser的数据库连接对象connection属性
如果是设置aop切片方式则需要在xml文件中设置那些需要事务操作,一般都是dao文件中的对数据库的操作,但是还是区分一下select和其他操作的区别对待就好了
<tx:advice id="txAdvice"
transaction-manager="transactionManager">
<!-- 用于配置详细的事务定义 -->
<tx:attributes>
<!-- 所有以get开头的方法都是只读的 -->
<tx:method name="get*" read-only="true" />
<!-- 其他方法默认都适用事务,指定超时5秒 -->
<tx:method name="*" isolation="DEFAULT" propagation="REQUIRED" timeout="5" />
</tx:attributes>
</tx:advice>
<aoconfig>
<!-- 配置一个切入点,匹配impl包下所有以impl结尾的类里的所有方法的执行 -->
<aopointcut expression="execution(* com.dao.impl.*Impl.*(..))" id="myPointcut" />
<!-- 将切入点myPointcut和增强txAdvice绑定-->
<aoadvisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
<!-- 再配置一个切入点,匹配impl包下所有以abc开头类里的所有方法的执行 -->
</aoconfig>
在来就是注解操作了,需要在实现增删改的方法上添加注解 ,不过注意 如果优化性能需要进行数据隔离新的配置,还有超时
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.DEFAULT, timeout=5)
当然还有全局jat事务操作,锁定多个行,不让其他操作进行事务处理 感觉用的不多
在xml中声明的实例如下
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"
jndiName="jdbc/jpetstore" />
<!-- 使用JtaTransactionManager类, 该类实现了PlatformTransactionManager接口 -->
<!-- 使用JTA全局事务,Spring容器可以自行从Java EE服务器中获取事务性资源,无需依赖注入 -->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
其他操作基本和jdbc的差不多
还是golang的gorm,默认是没有开启事务的,不过可以对其中进行设置,先前条件是有gorm.db对象存在
// 开启transaction事务
tx := db.begin() // 执行逻辑,假设使用方法将事务句柄和操作数据传递进去返回err判断
if err := 方法名(tx,数据);err!=nil{
tx.rollback()
}
// 如果返回nil
tx.commit;
基本就是这个操作
但是注意 开启事务之后如果增删改 对锁表的操作很频繁需要注意 很有可能是没有设置索引而导致的,因为innodb引擎默认是支持行锁事务处理的,但是增删改查做限制的条件不是索引,那么会在一张表中从上到下,一次根据查询where的条件操作并锁住不放开,如果数据在最后一个,那么从第一个数据开始会慢慢把整张表锁住,所以注意index在进行增删改查时很重要,对性能优化很大提升,
但也不是什么列都能进行索引设置的,一般对不经常修改的列,表中数据超多的列设置索引,不对经常变动的列设置索引,为啥不支持?因为索引的原理时和红黑二叉树差不多的操作,其中
保持左右两边平衡,如果一个数据时常修改那么索引就要不断对该数据列进行平衡,会耗费资源很多,还有也是占用硬盘空间,
主键不能当作索引来使用,不要以为是索引的一种就能当作索引来操作了,不能作为索引
还有事务操作过程中 四大原理
原子性
一致性
隔离性
持久性
1.原子性就是 把本来多个藕断丝连的sql操作当作一个sql来操作
2.一致性可以接上面的原子性 ,如果原子性质的一个sql语句执行出现问题就会rollback回滚 ,要么好,要么坏
3.隔离性 则是事务接管sql语句执行过程中给与其他事务的权限, 其中含有 等级低到高 需要时间越长
Read Uncommitted 能读取还没有commit提交的数据 (最好不要使用) 术语属于脏读
Read committed 能读取到事务提交的数据 但是如果a事务在select * 时 ,b事务commit了, 那么a事务再次select * 会读取到不同的数据 解决上面的脏读,但是出现不能每次读取一样的数据 术语属于不可重复读
Repeated Read: 在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交 解决脏读和不可重复度,但出现幻读(两个不同的事务操作在时间上的不一致导致查询的数据与对比不同)
Serialization 阻塞式的事务操作,只有一个事务操作完成之后才能让其他事务操作,(mysql引擎innodb默认支持锁行事务,所以这个用在银行转账比敏感的操作,不过效率不高)
一般情况 第二种和第三种都是能接受的加锁事务处理,但是设置到钱的敏感还是 最后一中串行阻塞的最好(因该?)
4.持久性 保存在服务器硬盘中,如果一旦commit持久化了,那么不能rollback回滚了
学习url
https://www.jb51.net/article/134677.htm
https://blog.csdn.net/qq_38362127/article/details/78130751
https://www.bilibili.com/video/av60556933?p=6
19.10.11学习日记随笔 mysql事务隔离性的更多相关文章
- 跟面试官侃半小时MySQL事务隔离性,从基本概念深入到实现
提到MySQL的事务,我相信对MySQL有了解的同学都能聊上几句,无论是面试求职,还是日常开发,MySQL的事务都跟我们息息相关. 而事务的ACID(即原子性Atomicity.一致性Consiste ...
- mysql 事务 隔离性 锁
1.四大特性 1.1 原子性(Atomicity) 一个事务是不可分割的最小工作单位.一个事务是不可分割的最小工作单位. 利用undo log保证原子性,undo log记录的是操作的反向语句,例如执 ...
- 一文讲清楚MySQL事务隔离级别和实现原理,开发人员必备知识点
经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢?本文就帮大家梳理一下. MySQL 事务 本文所说的 MySQL 事务都是指在 I ...
- Mysql事务-隔离级别
MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...
- mysql事务隔离级别、脏读、幻读
Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...
- MySQL事务隔离级别(二)
搞清楚MySQL事务隔离级别 首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB).表的结构如下: 为了说明问题,我们打开两 ...
- MySQL事务隔离级别(一)
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...
- Mysql 事务隔离级别分析
Mysql默认事务隔离级别是:REPEATABLE-READ --查询当前会话事务隔离级别mysql> select @@tx_isolation; +-----------------+ | ...
- 面试刷题29:mysql事务隔离实现原理?
mysql的事务是innodb存储引擎独有的,myisam存储引擎不支持事务. 事务最经典的例子就是转账了,事务要保证的是一组数据库的操作要么全部成功,要么全部失败.是为了保证高并发场景下数据的正确性 ...
随机推荐
- RHCSA考试(Linux7)
博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽 一.设置环境: 请初始化您的考试虚拟机 server0.example.com,将系统的 root 账号密码设置为 12 ...
- Mysql————基本sql语句
mysql中的基本语法有四种: 1.DDL语句:(用CREAT和DROP操作的语句) 用于创建.修改.和删除数据库内的数据结构,如:1:创建和删除数据库(CREATE DATABASE || DROP ...
- java内部类基础知识
一.java内部类具体分四大类 1.成员内部类 2.静态内部类 3.局部内部类 4.匿名内部类 1.成员内部类 :作为类的成员,存在于类中 //成员内部类可以调用外部类的所有 ...
- Java的同步和异步
同步:发送一个请求,等待返回,然后再发送下一个请求 异步:发送一个请求,不等待返回,随时可以再发送下一个请求 同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同 ...
- 编辑距离算法-DP问题
Levenshtein Distance The Levenshtein distance is a string metric for measuring the difference betwee ...
- 吴裕雄--python学习笔记:os模块的使用
在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告(从而发送测试报告邮件),经常要对大量文件和大量路径进行操作,这就依赖于os模块. 1.当前路径及路径下 ...
- 吴裕雄--天生自然 R语言开发学习:中级绘图
#------------------------------------------------------------------------------------# # R in Action ...
- OSCache使用指南
OSCache是当前运用最广的缓存方案, JBoss Hibernate Spring 等都对其有支持,下面简单介绍一下OSCache的配置和使用过程. 1.安装过程 从http://www.open ...
- mysql关系型数据库
参考:https://www.cnblogs.com/alex3714/articles/5950372.html 关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数 ...
- python有关汉字编码问题
python分为:程序编码(python安装程序).文件编码. 查看程序编码方式:sys.getdefaultencoding() 查看文件编码方式:1.import chardet 2. f = ...