1.特性ACID
同时成功,同时失败,将事务中进行的操作捆绑成一个不可分割的单元
数字库:rollback+savepoint+commit
java:connection.setAutoCommit()
cinnection.commit()
connection.rollback()
事务完成时,所有数据必须都保持一致状态
一个事务的执行不能被其他事务干扰,
并发的事务之间是隔离的,不能相互干扰
事务一旦提交,数据库中数据的改变是持久的
2.事务的隔离级别
该事务读到另一个事务还未提交的事务
读到未提交
同一个事务对同样的数据重复读两次,读到的结果不同(修改操作)
读两次,第二次读到第一次提交的
同一个事务进行两次查询操作,第二次查到的第一次查询中未出现的数据(增加)
读到提交后的数据
两个事务同时更新一行数据,后提交(或撤销)的事务覆盖先提交的数据
3.事务隔离级别
一个事务可以访问其他事务未提交的插入数据
一个事务可以访问其他事务未提交的更新数据
但一个数据已经开始写时,其他事务不能同时写
但允许其他事务读此条数据
防止 丢失更新
一个事务可以访问其他事务已提交的插入数据
一个事务可以访问其他事务已提交的更新数据
读取数据的事务允许其他事务继续访问该行数据
但未提交的写事务会禁止其他事务访问该行
防止 脏读
oracle,sql server
一个事务可以访问其他事务已提交的插入数据
但一个事务不可以访问其他事务未提交的更新数据
读取数据的事务会静止写事务(但允许读事务)
写事务会禁止其他任何事务
防止 不可重复的,脏读
mysql
事务序列化执行,事务只能一个接着一个的执行,不能并发
防止 不可重复读,幻读
4.事务处理两种情况
跨数据源,两个甚至是多个数据库同时允许
保证两个事务的隔离界别:技术JTA
单数据源 技术:JDBC
5.事务处理对象
- TransactionManager 接口
- 决定事务处理策略
粗略的事务管理:声明式,注解方案
细腻的事务管理
PlatformTransactionManager
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
6.事务管理器的配置项
取钱 存钱 转出 转入
是同时操作一个事务,还是开四个事务,有很多的组合方案
一直不提交会导致系统假死
- Read-only status只读
- rollback-for
在什么异常类型的情况下回滚
默认RuntimeException及其子类才回滚