事务的四个特性(caid):
原子性:要么全部成功commit,要么全部失败rollback.
一致性:rollback后的数据和原来的一致。
隔离性:事务和事务之间不干扰。一个事务必须与另外一个事务的执行结果隔离开。
持久性:执行成功。持久化数据。
事务和锁:
数据库操作都会产生锁,分为共享锁(select语句产生)和排他锁(dml语句)。一个事务中的语句执行完成后,在commit之后,语句影响的表记录才可以解锁。
如果没有定义事务隔离级别因此多个事务操作同一条数据可能会违反事务的caid特性。存在下面2个问题:
1)脏读取:
一个事务读取另外一个尚未提交的数据,然后第二个事务回滚了,那么第一个事务读取的就是无效的数据。
2)丢失数据修改:两个事务同时对一条数据修改,一个先提交,一个后提交,则先提交的事务的修改数据无效。
事务的属性:
1)事务的传播属性
设置事务的属性,来决定方法用不用事务,如何用。
2)事务的隔离级别
ISOLATION_DEFAULT
使用数据库默认的隔离级别
ISOLATION_COMMITTED
允许读取其他并发事务已经提交的更新(防此脏读)
ISOLATION_READ_UNCOMMITTED
允许读取其他并发事务还未提交的更新,会导致事务之 间的3个缺陷发生,这是速度最快的一个隔离级别,但同 时它的隔离级别也是最低
ISOLATION_REPEATABLE_READ
除非事务自身修改了数据,否则规定事务多次重复读取 数据必须相同(防此脏读,不可重复读)
ISOLATION_SERIALIZABLE
这是最高的隔离级别,它可以防此脏读,不可重复读和 幻读等问题,但因其侵占式的数据记录完全锁定,导致
它影响事务的性能,成为隔离级别中最展慢的一个。
3)事务只读
PROPAGATION_REQUIRED,readOnly
用于提升只读操作的效率。
4)事务超时
PROPAGATION_REGUIRED,timeout_5,readOnly
超过5s,没有回应则,将事务回滚。
常用连接池: 单线程 apache dbcp :org.apache.commons.dbcp.BasicDataSource
兼容dbcp且处理高并发的 tomcat pool jdbc: org.apache.tomcat.jdbc.pool.DataSourc
声明式事务:
spring 用aop在方法执行前开启一个事务,顺利执行完commit,异常则rollback。所以不用在方法里面来开启和关闭事务。
网友评论