JAVA----数据库事务
-
事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态
-
事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,也不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交,那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
-
数据一旦提交,就不可回滚
-
数据什么时候意味着提交?
- 当一个连接对象被创建时,默认情况下是自动提交事务;每次执行一个SQL语句时,如果执行成功,就会向数据库自动提交。
- 关闭数据库连接,数据就会自动的提交。如果有多个操作,且每个操作使用的是自己单独的连接,则无法保证事务。即同一个事务的多个操作必须在同一个连接下。
-
如何在JDBC程序中让多个SQL语句作为一个事务执行:
- 调用Connection对象的setAutoCommit(false);以取消自动提交事务
- 在所有的SQL语句都成功执行后,调用commit();方法提交事务
- 在出现异常时,调用rollback();方法回滚事务
- 若此时Connection没有被关闭,还可能被重复使用,则需要恢复其自动提交状态setAutoCommit(true)。
-
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。
- 脏读:对于两个事务T1,T2。T1读取了已经被T2更新但还没有被提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的。
- 不可重复读:对于两个事务T1,T2 。T1读取了一个字段,然后T2更新了该字段。之后,T1再次读取同一个字段,值就不同了。
- 幻读:对于两个事务T1,T2 。T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出几行。
-
四种事务隔离级别