事务带来的问题:
脏写:指的是同一行数据,一个事务对该行的更新操作覆盖了其他事务对改行数据的更新操作。(本质是写冲突)
脏读:一个事务读取了另外一个事务未提交的数据,就会导致读取的数据是脏数据。
不可重复读:同一个事务,相同的查询语句,不同时刻读取的结果不一致。
幻读:一个事务两次读取一个范围内的数据记录,读取的范围结果不同。
不可重复读和幻读的区别:
1.不可重复读的重点在于更新和删除操作,幻读的重点在于插入操作。
2.解决方式不同,使用锁机制解决的时候,因为不可重复读可以对范围数据加锁而使得无法对范围数据进行更新和删除操作,但是无法解决插入操作。
3.由2可知,不可重复读可由行锁避免,幻读不可以。
幻读要么使用串行化解决,要么使用乐观锁 MVCC机制(多版本并发控制),主要是使用了快照读和当前读。
事务隔离级别 脏读 不可重复读 幻读
读未提交 可能 可能 可能
读已提交 不可能 可能 可能
可重复读 不可能 不可能 可能
串行化 不可能 不可能 不可能
设置隔离级别
mysql可以使用命令行 transaction-isolation 选项 or 在my.cnf or 在my.ini中设置连接默认的隔离级别。
transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE}
也可以使用SET TRANSACTION来改变单个or所有连接的事务级别
例如:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE}
查询事务隔离级别
-- 查看全局的事务隔离级别
SELECT @@global.tx_isolation;
-- 查看当前会话的事务隔离级别
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;