事务

要么都成功,要么都失败(事务的原子性)

添加事务

//数据源

ComboPooledDataSource cpds = new ComboPooledDataSource();

Connection conn=cpds.getConnection();

获取连接,关闭自动提交事务(通过出c3p0连接池获取连接)

conn.setAutoCommit(false);

如果没有出现异常,提交事务

conn.commit();

出现异常进行回滚事务

conn.rollback();

回滚点

保存点的表示形式,保存点是可以从 Connection.rollback 方法引用的当前事务中的点。将事务回滚到保存点时,在该保存点之后所作的全部更改都将被撤消。

conn.setAutoCommit(false);

Savepoint savepoint =null;

每次执行500条数据后,设置一个回滚点

savepoint=conn.setSavepoint();

出现异常则提交当前回滚点之前没有出错的数据,尽量减少损失

conn.rollback(savepoint);

conn.commit();

事务的特性 ACID  (理解)

事务是并发控制的基本单元。所谓事务一个sql语句操作序列,这些操作要么都执行,要么都不执行,他是一个不可分割的工作单元。

例如:银行转账工作,从一个帐号扣款并使另一个帐号增款,这个两个操作,要么都执行,要么都不执行。

数据库的事务必须具备ACID特性,ACID是指 Atomic(原子性)、Consistensy(一致性)、Isolation(隔离型)和Durability(持久性)的英文缩写。

 

1、原子性(Atomicity

一个事务中所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中如果发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行一样。

2、一致性(Consistency

一个事务在执行之前和执行之后 数据库都必须处于一致性状态。

如果事务成功的完成,那么数据库的所有变化将生效。

如果事务执行出现错误,那么数据库的所有变化将会被回滚(撤销),返回到原始状态。

3、隔离性(Isolation

多个用户并发的访问数据库时,一个用户的事务不能被其他用户的事务干扰,多个并发的事务之间要相互隔离。

多个事务事件是相互独立的,多个事务事件不能相互干扰。 

a -b ----- 事务A

c -d ----- 事务B

如果A失败了,不能影响B

4、持久性:

指一个事务一旦被提交,它对数据库的改变将是永久性的,接下来即使数据库发生故障也不会对数据产生影响。

举例:ab转账

a-100

b+100

提交

结果: a 900 b 1100

开启事务

a - 100 出现错误 结果还是不变的。

事务的隔离级别

如果不考虑事务的隔离型,由于事务的并发,将会出现以下问题:

1、脏读 -- 最严重,杜绝发生

2、不可重复读

3、幻读(虚读)

脏读:指一个事务读取了另外一个事务 未提交的数据


不可重复读:在一个事务内多次读取表中的数据,多次读取的结果不同。

和脏读的区别: 不可重复读是读取的已提交数据


幻读(虚读)

 指在一个事务中 读取 另一个事务 插入或删除 数据记录,导致当前事务 读取数据前后不一致。

数据库的隔离级别

数据库共定义了4种隔离级别(限制由高到低, 性能从低到高):

serializable(串行化):可避免 脏读、不可重复读、虚读情况的发生。

repeable read(可重复读):可避免 脏读、不可重复读 不可避免 虚读mysql采用可重复读

read committed(读已提交):可避免 脏读,不可避免 不可重复读、虚读oracle采用读已提交。

read uncommitted(读未提交):不可避免 脏读、不可重复读、虚读








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值