参考文章
https://blog.csdn.net/qq_35206244/article/details/82493215
https://www.cnblogs.com/wyaokai/p/10921323.html
1、事务属性
原子性(Atomicity):
事务内的操作要么都执行、要么都不执行。不可分割。
一致性(Consistency):
数据库在事务执行前后都处于一致性状态,从一个一致性状态转换为另一个一致性状态。完整性约束没有被破坏。
原子性、隔离性、持久性都为了一致性,是目的。
隔离性(Isolation):
多个事务之间相互隔离运行,互不打扰,不能同一时间请求同一数据,要么在前、要么在后。提供了4中隔离级别。
持久性(Durability):
事务一旦提交就是永久性的,断电后也会存在数据库中。
2、不考虑事务的隔离性,出现的问题
脏读:一个线程中的事务读到了另一个线程中事务尚未提交的数据。(可能读到回滚的数据)
解决方法:禁止读取未提交的事务。
不可重复读:一个事务内两次读到的数据不一样。(两次读之间有别的事务修改且提交了数据,针对修改记录操作)
解决办法:一个事务读的时候,禁止任何事务写。记录上加写锁。
幻读:一个事务内两次读到的数据不一样。(两次读之间有别的事务新增且提交了数据,针对表的新增记录操作)
解决办法:加全局写锁,即表上加锁。
3、事务隔离级别
读未提交(Read-uncommitted):可能出现脏读、不可重复读、幻读。
读已提交(Read committed):可能出现不可重复读、幻读。解决了脏读问题。
可重复读(Repeatable read):可能出现幻读。
串行化(Serializable ):都不可能出现。
4、设置事务的隔离级别
1)可设置级别xxxx:
read uncommitted
read committed
repeatable read
serializable
2)查询事务的隔离级别:(默认级别是可重复读)
select @@tx_isolation;
select @@session.tx_isolation;
select @@global.tx_isolation;
3)设置事务的隔离级别
设置下一次事务的隔离级别,下一次事务提交自动失效
set transaction isolation level xxxx
设置当前会话的隔离级别,会话结束自动失效
set session transaction isolation level xxxx
设置全部会话的隔离级别,不影响本次和已经连接的会话,作用于新打开的会话
set global transaction isolation level xxxx
备注:
在当前窗口中设置global级别:
查询@@tx_isolation和@@session.tx_isolation不会生效,只有@@global.tx_isolation生效
在当前窗口中设置session级别:
查询@@global.tx_isolation不会生效,@@session.tx_isolation、@@tx_isolation生效
在当前窗口中设置transaction级别:
查询@@global.tx_isolation、@@session.tx_isolation、@@tx_isolation都不生效
在当前窗口中设置global级别:
重新打开的窗口,查询@@tx_isolation和@@session.tx_isolation、@@global.tx_isolation都生效
重新启动数据库,设置的global级别失效,恢复为默认的 repeatable read