事务是用户定义一个操作序列。事务认为,这些操作序列是一个不可分割的工作单位。
事务有四个特点:原子性、一致性、隔离性和持久性。
事务的原子性,表示事务执行过程中,用户定义的操作序列要么全部执行成功,要么全部执行失败。
事务的一致性,表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态,这称为事务回滚。
事务的隔离性,表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。
事务的持久性,表示事务完成之后,对系统的影响是永久性的。如果已提交的数据在事务执行失败时,数据的状态都应该正确。
使用数据库时 要求数据库存储引擎必须是 InnoDB 引擎。
JDBC实现事务的方式
1、保证一个业务的所有更新操作中,所使用的连接对象为同一个对象。
2、把链接对象的提交方式设置为手动提交;
con.setAtoCommit(false)
通过con.commit(); 提交事务,
如果有异常方式时。可以通过con.rollback()回滚事务。
事务的并发问题:
当两个或两个以上的线程,同时访问同一条记录时,就存在事务并发问题,可能造成数据混乱。
1、脏读: 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的是脏数据。
2、不可重复读: 事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据做了跟新并提交,导致事务A多次读取同一数据时,结果不一致。
3、幻读: 事务A对数据库的数据进行批量操作。事务B完成记录的添加,这时新加的记录可能就没有进行事务A批量操作,这就是幻读。
解决事务并发问题 ,需要采用事务隔离级别来进行:
READ UNCOMMITTED:未提交读,该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读,不可重复读和幻读。 READ COMMITTED:提交读,该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读。 REPEATABLE READ:可重复读,该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。 SERIALIZABLE:串行读,所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。