数据库之事务
事务:
事务象征着一个工作单元,也就是操作序列。这些操作要么都执行,要么都不执行。在每个事务结束时,都保持数据的一致性。
由此衍生出了事务的四个特性:ACID;
- 原子性(Atomicity)事务是一个不可分割的操作。一系列的操作要么都完成,要么都不完成。
- 一致性(Consistency) 保证在事务前和事务结束后,数据库的完整性约束没有被破坏。
- 隔离线(Isolation) 保证了事务与事务之间是透明的,互不干扰的。
- 持久性(Durability) 保证了事务提交的结果能被永久保存下来。
事务语句:
开始事务:BEGIN TRANSACTION;
提交事务:COMMIT TRANSACTION;
回滚事务:ROLLBACK TRANSACTION;
数据库并发产生的问题
- Lost updates(更新丢失)
- Dirty read(脏读)
- Unrepeatable read(不可重复读)
更新丢失:指在两个事务访问相同的数据库数据时,那么其中一个事务的结果会把另一个事务的结果覆盖。
例如:
Transaction-A |
Time | Transaction-B |
--- | t0 | ---- |
Read X | t1 | ---- |
---- | t2 | ReadX |
Update X | t3 | ---- |
--- | t4 | UpdateX |
---- | t5 | ---- |
事务B的更新导致了事务A的更新丢失。
脏读:事务A读取到了事务B尚未提交的数据。该数据有可能会因为回滚从而失效。那么有造成错误的隐患。
Transaction-A | Time | Transaction-B |
--- | t0 | --- |
--- | t1 | Update X |
Read X | t2 | ---- |
--- | t3 | Rollback |
--- | t4 | --- |
不可重复读:一个事务对同一行数据读取了两次,得到不同的结果:具体分为两种情况:
1.虚读:事务1在对同一记录读取两次的过程中,事务2对该记录进行了修改,从而事务1第二次读到不一样的记录;
2.幻读:事务1在两次查询的过程中,事务2对表进行了修改,更新操作,从而事务1的两次查询的结果是不一样的;
(tips:脏读是指读到了尚未提交事务的数据,而不可重复读是读到提交事务的数据)
事务隔离级别:
程度 | 描述 |
Level0 (Read uncommited)读未提交 |
在该级别下,一个事务对一行数据的修改过程中,不允许其他事务对该行数据进行修改,但允许其他事务对它进行读操作。在该级别下可以避免更新丢失,但是不能避免脏读和不可重复读。 |
Level 2 (Read commited) 读提交 |
在该级别下,未提交的写事务不允许其他事务访问该行数据。因此不会出现脏读。但是读事务允许其他事务访问该行数据。 因此会出现不可重复读的情况。 |
Level3 (Repeatable read)重复读 |
在该级别下,读事务禁止写事务,但允许读事务,因此不会出现同一事物两次读到不同数据的情况(既可以避免不可重复读),并且写事务禁止其他一切事务。 |
Level4 (Serializable)序列化 |
要求所有的事务都必须串行执行,因此能避免一切并发引起的问题。但是效率很低。 |
使用事务时需要注意的事情:
- 不要在循环中提交事务
- 不要使用自动提交
- 不要使用自动回滚
- 不要使用长事务
友情链接:
数据库事务详解
上一篇: 数据库之事务
下一篇: MySQL innodb行锁测试