MySQL 事物隔离级别

1.什么是事物:

            访问并可能更新数据库的一个完整的程序执行单元(UNIT)

2、事物必须满足ACID特性:
A,atomic,原子性,要么都提交,要么都失败,不能一部分成功,一部分失败。
C,consistent,一致性,事物开始及结束后,数据的一致性约束没有被破坏
I,isolation,隔离性,并发事物间相互不影响,互不干扰。
D,durability,持久性,已经提交的事物对数据库所做的更新必须永久保存。即便发生崩溃,也不能被回滚或数据丢失。

3.事物中存在的问题:
dirty read (脏读)、unrepeatable read(不可重复读)、phantom read(幻读)

4.四个事物的隔离级别:
READ UNCOMMITED RU:读未提交,一个事物中,可以读取到其他事物提交的变更。
READ COMMITTED,RC:读已提交,一个事物中,可以读取到其他事物已经提交的变更。
REPEATABLE READ,RR可重复读:在一个事物中,直到事物结束前,都可以反复读取到一开始看到的数据,不会发生变化,该级别可保证事物的一致性。


时间: 2024-09-20 07:34:25

MySQL 事物隔离级别的相关文章

事物隔离级别和行日志格式设置不当导致故障案例

最近刚接手个新项目的测试平台采用了spring的事务机制,在用户认证登录时总是提示认证超时,于时查看相应的各应用服务器日志,发现报了异常: Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'... ...... 前端某台应用服务器报如下错: {"returnNo":0,"listFie

mysql 事务 线程-mysql事物隔离的问题,求大神指教

问题描述 mysql事物隔离的问题,求大神指教 我对mysql事物隔离性一向是一知半解,这次还是下决心做了一个测试,不过测试的结果无法解释求大神指教:主函数如下:public static void main(String args[]) { // 初始化数据库 String dev = ""com.mysql.jdbc.Driver""; String url = ""jdbc:mysql://localhost:3306/testdb?rel

MySQL事务隔离级别介绍及设置

READ UNCOMMITTED(未提交) 即使没有提交,对其它事务也可见.未提交的数据会引起脏读(Dirty Read). 测试流程: 1.A设置read-uncommitted, start transaction 2.B执行start transaction,修改一条记录, 3.A查询记录,得到了以为正确的记录 4.B回滚. 问题:A读到了B没有提交的记录,也就是脏读. READ COMMITTED(提交读) 一个从开始直到提交之前所做的任何修改对其它事务都是不可见的.两次同样的查询可能会

浅析MYSQL REPEATABLE-READ隔离级别_Mysql

REPEATABLE-READ 即可重复读,set autocommit= 0或者START TRANSACTION状态下select表的内容不会改变.这种隔离级别可能导致读到的东西是已经修改过的. 比如: 回话一中读取一个字段一行a=1 在回话二里这个字段该行修改a=0,并且提交 回话一中再update这个字段a=0,会发现受影响行数是0,这样就可以根据受影响行数是0还是1判断此次修改是否成功! 这在某些程序里会很有用! 会话1: mysql> set autocommit=0; Query

mysql事务隔离级别与spring事务配置

问题描述 代码:voidfun(){Useruser=newUser();user.setId(1);user.setName("aaa");update(user);UsernewUser=select(1);//这里查询出的newUser的name还是更新前的值.}voidupdate(Useruser){//更新用户信息}Userselect(id){//根据id查询用户信息} 使用spring配置的事务的时候,上面方法fun.update被spring配置了事务propagat

[用事实说明两个凡是]一个由mysql事务隔离级别造成的问题分析

背景 最近要做一个批跑服务, 基本逻辑就是定时扫描数据库的记录, 有满足条件的就进行处理(一条记录代表一个任务,以下任务与记录含义相同). 要求支持多机部署批跑服务. 批跑支持多机部署实现方案 要实现多机部署, 只要保证每个批跑服务实例每次只获取一条记录, 处理完再获取下一条即可. 其中最种要的是避免不同的实例获取到同一条记录,即所谓抢任务. 先看表结构设计: create database if not exists ae; create table ae.task ( id int prim

MySQL事务隔离级别详解(转)

原文: http://xm-king.iteye.com/blog/770721 SQL标准对事务定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销.实际中,最常用的级别为Read Committed(读取提交内容).Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交

MySQL的事务隔离级别和锁

MySQL的事务隔离级别:Read Uncommitted[读未提交数据]Read Committed[读已提交数据]Repeatable Read[可重读]Serializable[可串行化] 查看MySQL的事务隔离级别:默认.全局和会话事务隔离级别: SELECT @@tx_isolation SELECT @@global.tx_isolation; SELECT @@session.tx_isolation; mysql> select @@tx_isolation; +-------

MySQL中Innodb的事务隔离级别和锁的关系的讲解教程_Mysql

前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力.所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在.这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么. 一次封锁or两段锁?因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用