为什么需要事务
现在的软件都是多用户,多程序,多线程的,对同一个表可能同时有很多人在用,为了保证数据的一致性,所以提出了事务的概念。
事务语法
开启事务
BEGIN、start TRANSACTION(推荐使用)、begin work
事务回滚
rollback;
事务提交
commit
还原点 savepoint;
事务特性:
原子性
一个事务是一个不可分割的工作单位,事务中包含诸多操作,要么都成功 要么都失败。
一致性
事务必须从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性
一个事务的执行不能被其他事务干扰。即一个事务内的操作及数据对并发其他事务是隔离的,并发各个事务之间不能相互干扰
持久性
当一个事务一但被提交,它对数据库中的数据的改变应该是永久性的。接下来的其他操作或者故障不应该对其有影响。
事务隔离级别
查看事务隔离级别
show variables like ‘%tx_isolation%’;
设置事务隔离级别的语句
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED (红字部分更换成对应的隔离级别就可以)
未提交读(READ UNCOMMITED)
session1 开启事务 执行数据操作,session1未提交或者回滚的情况下 session2 查询到数据数据是修改后的数据,这样session1在回滚的时候session2中读到的是脏数据。
读已提交(READ COMMITED)
session1开始事务执行操作数据语句 未提交事务 session2查询到的数据是没有改变的数据。当session1 commit后session2 查询到修改后的数据。
可重复读(REPEATABLE READ)
session1 开启事务 session2开启事务 ,当session1 操作完数据后 并且commit后, session2 select 是修改前的数据,这样就产生了幻读。
可串行化(SERIALIZABLE)
sesion1 开启事务 session2开启事务,当session1 insert 数据 session2 insert的时候会报错。当进行读写操作的时候会锁整个表。

事务隔离级别可重复读时,如果有索引的时候,以索引条件进行更新数据,会存在间隙锁、行锁、页锁 锁住一些行,如果没有索引,更新表示就会产生表锁。
事务隔离级别为串行化时 ,读写都会产生表锁。
事务隔离级别越高,越能保证数据的一致性,单并发性能的影响也越大,对于多数应用程序有限考虑数据库隔离级别为 读已提交 (read committed),它能避免 脏读 并且有较好的并发性。
