Jdbc--事务

事务:
事务就是一件事情,这件事情可能由多个单元组成,这些单元要么全都成功,要么全都不成功。
事务的操作:
开启事务:
设置事务提交方式为手动:con.setAutoCommit(false);
设置回滚点:con.setSavepoint();
事务回滚:con.rollback();
事务提交:con.commit();

事务特性:
ACID
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

脏读:一个事务读取到了另一个事务未提交数据
不可重复读:指多次读取的数据不一致(读取到了一个事务的提交数据)  强调update【指的是数据内容的变化】
虚读或幻读:指多次读取的数据不一致 强调insert 【指的是数据的数量的变化】

事务隔离级别:
1 Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
2 Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免虚读
3 Read committed:可避免脏读情况发生(读已提交)
4 Read uncommitted:最低级别,以上情况均无法保证。(读未提交)
Mysql数据库默认是  Repeatable read
Oracle数据库默认是read committed
设置事务的隔离级别:
MySQL中:Set session transaction isolation level read uncommitted;
jdbc中:
void setTransactionIsolation(int level)  throws SQLException
上述方法是Connection接口中的用于设置事务隔离级别的方法参数可以是以下
level - 以下 Connection 常量之一:
Connection.TRANSACTION_READ_UNCOMMITTED、
Connection.TRANSACTION_READ_COMMITTED、
Connection.TRANSACTION_REPEATABLE_READ 或
Connection.TRANSACTION_SERIALIZABLE。
(注意,不能使用 Connection.TRANSACTION_NONE,因为它指定了不受支持的事务。)

丢失更新:
两个事务对同一条记录进行操作,后提交的事务将先提交的事务的修改操作覆盖了。
方案一:悲观锁 (假设丢失更新一定会发生 ) ----- 利用数据库内部锁机制,管理事务
方案二:乐观锁 (假设丢失更新不会发生)------- 采用程序中添加版本字段解决        丢失更新问题

悲观锁又分成两种 
1.共享锁   可以在一条记录上添加多个共享锁   lock in share mode
2.排它锁   排它锁,它不能与其它锁共存,只要添加了排它锁的语句执行完毕后其他要执行此语句的语句才可以执行。
update操作默认添加排它锁 
for update【select * from account for update;】就可以添加排它锁
乐观锁:
它是使用版本字段来控制。
            create table product (
   id int,
   name varchar(20),
   updatetime timestamp
);
insert into product values(1,'冰箱',null);
update product set name='洗衣机' where id = 1;
当修改操作之前,再执行一次查询,得到time的时间,并且将此时间与之前的时间进行对比,若相等说明
之前没有其他事务对此数据进行操作,如果不相等就代表其他事务对此数据进行过了操作。

猜你喜欢

转载自jackpot1234.iteye.com/blog/2326669