标签:事务隔离级别
1、如果是两个线程并发修改,一定会互相捣乱,这时必须利用锁机制防止多个线程的并发修改
2、如果两个线程并发查询,没有线程安全问题
3、如果两个线程一个修改,一个查询......会有3种问题:
1).脏读:一个事务读取到另一个事务未提交的数据
2).不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同 --- 行级别的问题(改)
3).虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致 --- 表级别的问题(增删)
四大隔离级别:
Read uncommitted -- 不防止任何隔离性问题,具有脏读/不可重复度/虚读(幻读)问题
Read committed -- 可以防止脏读问题,但是不能防止不可重复度/虚读(幻读)问题
Repeatable read -- 可以防止脏读/不可重复读问题,但是不能防止虚读(幻读)问题
Serializable -- 数据库被设计为单线程数据库,可以防止上述所有问题
从安全性上考虑: Serializable>Repeatable read>read committed>read uncommitted
从效率上考虑: read uncommitted>read committed>Repeatable read>Serializable
真正使用数据的时候,根据自己使用数据库的需求,综合分析对安全性和对效率的要求,选择一个隔离级别使数据库运行在这个隔离级别上.
mysql 默认下就是Repeatable read隔离级别
oracle 默认下就是read committed隔离级别
查询当前数据库的隔离级别:select @@tx_isolation;
设置隔离级别:set [global/session] transaction isolation level xxxx;其中如果不写默认是session指的是修改当前客户端和数据库交互时的隔离级别,而如果使用golbal,则修改的是数据库的默认隔离级别。
数据库中的锁机制----共享锁,排他锁:
在非Serializable隔离级别做查询不加任何锁,而在Serializable隔离级别下做的查询加共享锁。特点:共享锁和共享锁可以共存,但是共享锁和排他锁不能共存
在所有隔离级别下进行增删改的操作都会加排他锁。特点:和任意其他锁都不能共存
标签:事务隔离级别
原文地址:http://8477424.blog.51cto.com/8467424/1771665