数据库事务(Database Transaction)
数据库事务(Database Transaction) : 是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元.
一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:
-
为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
1 事务的特性ACID
1.1 原子性(Atomicity)
一个事务是一个不可分割的工作单位.
事务包含的所有操作要么全部成功,要么失败全部回滚。事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
1.2 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。一致性与原子性是密切相关的。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
1.3 隔离性(Isolation)
多并发处理 (问题: 脏读 不可重复读 幻读)
一个事务的执行不能被其他事务干扰。
比如有多个用户操作同一张表时,数据库为每一个用户开启事务,任何用户自己的事务都不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
1.4 持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
例如我们在使用JDBC操作数据库时,在提交事务方法后,当程序执行完成直到看到提示后,就可以认定事务正确提交,即使这时候数据库出现了问题,也不会丢失之前已经正确提交事务的操作。
2 事务隔离级别
1. 读未提交 READ_UNCOMMITTED
该隔离级别允许脏读取,其隔离级别是最低的。
脏读 一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。
举例: 张三开一个事务,打算给李四转账 , 李四也开了一个事务,
张三转了1000, 没有提交事务; 李四查询查到了. 张三回滚事务.
2 读已提交 READ_COMMITED
不会出现脏读,但会出现不可重复读.
**不可重复读:**在同一事务中,多次读取同一数据返回的结果有所不同以读到另一事务已提交的更新数据。
张三给李四转钱. 张三开一个事务,李四开一个事务. 张三给李四转钱, 没有提交,李四查不到, 张三提交事务,李四查看到账了. (不可重复读)
两个事务之间有相互干扰!
3 可重复读 REPEATABLE_READ
该隔离级别不会出现不可重复读,但会出现幻读
**幻读:**一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录
4 顺序读 SERIALIZABLE
顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执行,即事务只能一个接一个地处理,不能并发。
可以解决幻读!
事务隔离级别 | 脏 读 | 不可重复读 | 幻 读 |
---|---|---|---|
读未提交READ_UNCOMMITTED | 允许 | 允许 | 允许 |
读已提交READ_COMMITTED | 禁止 | 允许 | 允许 |
可重复读REPEATABLE_READ | 禁止 | 禁止 | 允许 |
顺序读(SERIALIZABLE) | 禁止 | 禁止 | 禁止 |