2.事务四大隔离级别

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隔离级别下做的查询共享锁特点:共享锁和共享锁可以共存,但是共享锁和排他锁不能共存

在所有隔离级别下进行增删改的操作都会加排他锁特点:和任意其他锁都不能共存