事务是什么
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
以上来自百度
为什么要用事务
事务在程序里很常见 当一个程序要执行多条SQL语句时无法保证都能成功 有可能出现插入一半出现了意外 导致下面无法进行 这就无法保证要么做要不都不做(原子性)也无法保证 数据的一致性
例子:如果你用手机进行银行转账 A 转给B A应该减少资产 B应该是增加资产 如果 只有一方成功 无法完成转账 这个时候就需要事务
事务的特性
原子性
原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做
隔离性
隔离性是指多个事务并发执行的时候,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰
持久性
持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响
一致性
原子性关注状态,要么全部成功,要么全部失败,不存在部分成功的状态。而一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见
上面就是事务的特性
隔离级别
事务是支持隔离级别的 上面说到了事务具有隔离性 多个事务是隔离的互不干扰 下面看下 个个隔离级别
未提交读( read uncommitted )
事务中修改即使没提交 别的事务也可读取到(会造成脏读)性能也一般 不常用
提交读 ( read committed )
只有提交别的事务才能看见 再此之前都不会被看见 (常用事务ps:mysql默认不是这种)
可重复读( repeatable read )
在一个事务中多次查询结果都是一致 解决了脏读问题 但范围查询会出现幻读 PS:mysql默认级别 用版本控制解决幻读(幻读 查不不到但是又插入不进去)
可串行化( serializable )
最高隔离级别 每次读数据都会加锁 所以也会导致大量超时和锁争用 非常需要数据一致性 并且没有并发的情况下可以使用
脏读是什么
A事物数据读取后,B事物回滚,导致A读取数据有误
幻读是什么
A事物第一次和第二次读取数据之间,B提交事物,导致A读取不同
如何更改隔离级别
Mysql如何更改事务级别 set session transaction isolation level + 级别区别: