事务
2019-11-21 本文已影响0人
matthewfly
-
jdbc事务
事务必须遵循acid,即原子性、隔离性、一致性、持久性。jdbc的事务都是通过Connecttion接口完成的,涉及到:
- setAutoCommit 设置是否自动提交,当setAutoCommit(false)时,表示开启事务,需要手动提交;默认为true,执行完一条sql命令后自动提交。
- commit 提交sql命令,可以是一条或多条。
- rollback 回滚操作,回滚之前提交的一条或多条操作命令。
- setSavepoint 在一系列操作中设置一个保存点,后续可以回滚到该保存点。
- rollback(Savepoint savepoint) 回滚至某个保存点。
- releaseSavepoint(Savepoint savepoint) 释放某个保存点。
-
并发事务级别
事务控制由严格到宽松有多个级别,相应的事务也会产生各类并发问题:
- 脏读 事务b中读取到事务a未提交的记录。
- 不可重复读 事务b中读取同一条记录的结果不同。可能是在事务b过程中事务a对该记录进行了更新。
- 幻读 事务b中两次读取同一张表的记录条数不同。可能是事务b中事务a对该表进行了插入操作。
- jdbc事务级别
- TRANSACTION_NONE 没有事务
- TRANSACTION_READ_UNCOMMITTED 读未提交。 可能出现脏读、不可重复读、幻读。事务级别最低,但速度最快。
- TRANSACTION_READ_COMMITTED 读提交。可以避免脏读数据,但可能出现不可重复读、幻读。
- TRANSACTION_REPEATABLE_READ 可重复读。避免脏读、不可重复读,但可能出现幻读。
- TRANSACTION_SERIALIZABLE 串性操作。对整个表加锁,进行串性访问,都避免,但性能最低。
jdbc事务级别由setTransactionIsolation(int level)方法设置。mysql默认事务级别为TRANSACTION_REPEATABLE_READ。