为什么需要事务
事务主要用来保证数据的合理性和并发处理的能力。
例子:
-
银行中的转账操作,账户 A 把一定数量的款项转账到账户 B 上,这个操作包括两个步骤,一个是从账户 A 上吧存款减去一定的数量,而是账户 B 上把存款加上相同的数量。这两个步骤显然要么都完成,要么都取消,否则银行就会受损失。显然,这个转账操作中的两个步骤就构成一个事物。
-
假设 A 和 B 用户都希望查询修改 M 表数据,A 用户不应该刚把 M 表的数据改成 5,查询时显示的数据却是 8 (因为 B 用户修改 M 表的数据成 8 了),事务必须得保证多个用户对共享资源同时访问时,数据库给用户的反应是合理的。
事务是用来研究什么的
- 避免数据处于不合理的中间状态。如转账。
- 怎样避免多用户同时访问时呈现给用户的数据是合理的,现在仍然没有很好的解决办法。
事务和线程的关系
事务也是通过锁来解决很多问题的。
线程同步就是通过锁来解决的, synchronized。
事务和第三方插件的关系
-
直接使用事务库技术的难度很大,很多人借用第三方插件实现,数据库中的事务的语法细节不需细细研究。
-
第三方插件想要完成预期的功能,一般必须得借助数据库中的事务机制来实现。
事务三种运行模式
-
自动提交事务
每条单独的语句都是一个事物。如果成功执行,则自动提交;如果错误,则自动回滚。 -
显式事务
每个事务均以 BEGIN TRANSACTION 语句显式开始。
以 COMMIT 或 ROLLBACK 语句显示结束。 -
隐性事务
在前一个事务完成时新事物隐士启动,但每个事务仍以 COMMIT 或 ROLLBACK 语句隐士结束。
事务的四大特性
-
原子性:事务是一个完成的操作。事务的各步操作是不可分的(原子的):要么都执行,要么都不执行。
-
一致性:当事务完成时,数据必须处于已知状态,要么处于开始状态,要么处于结束状态,不允许出现中间状态。
-
隔离性:指当前的事务与其它未完成的事务是隔离的。在不同的隔离级别下,事务的读取操作,可以得到的结果是不同的。
-
持久性:事务完成后,它对数据的修改被永久保持,事务日志能够保持事务的永久性。
网友评论