事物隔离级别
来源:互联网 发布:centos 配置hadoop 编辑:程序博客网 时间:2024/06/01 07:25
1.什么是事物?
百度百科
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。
通俗理解:就是一荣俱荣,一毁聚毁;就是所有的 单元逻辑操作都成功执行,才可以;要是其中只要有一个单元逻辑操作失败,就 回滚 到 原先一模一样 的状态;
事物ACID
l atomicity:原子性,在一个事务中的所有操作,相当于一个原子操作,要么全部成功,要么全部失败。
l consistency:一致性,就是在事务执行前后,对于事务本身的用意而言,数据库中的数据是保持一致的,数据库的一致性是建立在原子性的基础之上的,更多的由编码的程序员保证,最经典的案例是A,B帐号之间的转账。l isolation:隔离性,事务的隔离性是指事务和事务之间的数据可见性,这也是本文需要详细介绍的地方。数据库定义了各种隔离级别,以在并发性和数据完整性中权衡。
l durability:持久性,事务完成以后,所有的数据都将持久到数据库中,不会因为其他原因而丢失。
MYSQL的事务处理主要有两种方法。
1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认
2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!
个人推荐使用第一种方法!
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!(切记!)
2.事物隔离级别
2.1为什么会有 或者说 设置 事务隔离级别?
因为事物读写不加约束的话,可能 会带来一些问题:
1.脏读 ,一个事务读取到了另一个事务未提交的数据操作结果。这是相当危险的,因为很可能所有的操作都被回滚。
2,不可重复读,一个事物对一条数据重复读,会得到不同的结果,那是因为 其他事物对该条记录进行了操作,所导致。
read uncommitted ( 读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
REPEATABLE-READ事务隔离级别,当两个事务同时进行时,其中一个事务修改数据对另一个事务不会造成影响,即使修改的事务已经提交也不会对另一个事务造成影响。
在事务中对某条记录修改,会对记录加上行共享锁,直到事务结束才会释放。
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:
设置mysql 隔离级别 方法
1.全局修改,修改mysql.ini配置文件,在最后加上
1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.2 [mysqld]3 transaction-isolation = REPEATABLE-READ
这里全局默认是REPEATABLE-READ,其实MySQL本来默认也是这个级别
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
重启mysql
开始->运行->cmd
停止:net stop mysql
启动:net start mysql
前提MYSQL已经安装为windows服务
再来说说锁机制:
共享锁:由读表操作加上的锁,加锁后其他用户只能获取该表或行的共享锁,不能获取排它锁,也就是说只能读不能写
排它锁:由写表操作加上的锁,加锁后其他用户不能获取该表或行的任何锁,典型是mysql事务中
锁的范围:
行锁: 对某行记录加上锁
表锁: 对整个表加上锁
这样组合起来就有,行级共享锁,表级共享锁,行级排他锁,表级排他锁
- 事物及事物隔离级别
- 事物隔离级别
- 事物的隔离级别
- 数据库事物隔离级别
- 数据库事物隔离级别
- 事物的隔离级别
- 数据库事物隔离级别
- 数据库事物隔离级别
- 事物隔离级别介绍
- 事物隔离级别
- ORACLE事物隔离级别
- Oracle 事物隔离级别
- Hibernate 事物隔离级别
- 数据库事物隔离级别
- 事物隔离级别
- 数据库事物隔离级别
- 数据库事物隔离级别
- mysql事物隔离级别
- Androdi编程:Activity的四种启动模式
- hdu1087 Super Jumping! Jumping! Jumping!
- base64转码
- mac xampp apache php 配置
- hdoj-1266-Reverse Number
- 事物隔离级别
- 我的Python学习之路之基本语法-函数
- 软件测试1
- join中连接条件放置位置
- 正则表达式匹配语法
- javascript 事件处理
- ITOO项目选课系统的问题小结
- 正则表达式
- 字符串函数小结---老是忘记