事务的四大特性
原子性
整个事务的所有操作,要么全部执行成功,要么全部失败回滚。
一致性
数据库总数从一个一致性状态转换到另一个一致性状态。
隔离性
一个事务所作的修改在提交之前,对其他事务是不可见的。
持久性
一旦事务提交,则其所做的修改会永久保存在数据库中。
事务的隔离级别
READ UNCOMMITTED(未提交读)
事务中的修改,即使没有提交,对其他事务也可见。事务可以读取未提交的数据,也被成为脏读(Dirty Read)
READ COMMITTED(提交读)
一个事务从开始到提交之前,所做的任何修改对其他事务是不可见的。这个级别也可叫做不可重复读。
REPEATABLE READ(可重复读)
该级别无法解决幻读问题。所谓幻读,指的是当某个事务在读取某个范围的记录时,另外一个事务又在该范围插入了新的记录,当值位的事务再次读取该范围的记录时,会产生幻行(Phantom Row)——即多出了几行数据。
SERIALIZABLE(可串行化)
强制事务串行执行,避免了幻读问题。
不可重复读和幻读的区别
(1) 不可重复读是读取了其他事务更改的数据,针对update操作
解决:使用行级锁,锁定该行,事务A多次读取操作完成后才释放该锁,这个时候才允许其他事务更改刚才的数据。
(2) 幻读是读取了其他事务新增的数据,针对insert和delete操作
解决:使用表级锁,锁定整张表,事务A多次读取数据总量之后才释放该锁,这个时候才允许其他事务新增数据。
MYSQL中的事务
自动提交(AUTOCOMMIT)
如果不是显示的开始一个事务,则每个查询都被仿作一个事务执行提交操作。