sqlite事务理解

转:https://blog.csdn.net/qq_40111789/article/details/82670810

SQLite 事务(Transaction)

事务(Transaction)是一个对数据库执行工作单元。事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成。

事务(Transaction)是指一个或多个更改数据库的扩展。例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务。重要的是要控制事务以确保数据的完整性和处理数据库错误。

实际上,您可以把许多的 SQLite 查询联合成一组,把所有这些放在一起作为事务的一部分进行执行。

事务的属性

事务(Transaction)具有以下四个标准属性,通常根据首字母缩写为 ACID:

  • 原子性(Atomicity):确保工作单位内的所有操作都成功完成,否则,事务会在出现故障时终止,之前的操作也会回滚到以前的状态。

  • 一致性(Consistency):确保数据库在成功提交的事务上正确地改变状态。

  • 隔离性(Isolation):使事务操作相互独立和透明。

  • 持久性(Durability):确保已提交事务的结果或效果在系统发生故障的情况下仍然存在。

大家在使用sqlite的时候应该都知道每一条操作都是通过一个SQL语句来完成的,例如:

SQLiteDatabase db = ...;
db.execSQL("insert into person (name, age) values(?,?)", new Object[]{"张三", 4});
//这句的意思大家都知道,没错就是往person表里面插入一条数据
//不过大家平时在使用的使用一般都是这样用的:

db.beginTransaction();
try 
{
    db.execSQL("insert into person (name, age) values(?,?)", new Object[]{"张三", 4});
    db.setTransactionSuccessful();
} 
finally 
{
    db.endTransaction();
    db.close();
}

当然了,大家都知道这是开启事务如果事务部成功到结束事务的时候就回滚而非提交,很多人都能说出来但是却不知道意思。



如果把上面的代码改成这样:
db.beginTransaction(); // 开启事务
try 
{
    db.execSQL("insert into person (name, age) values(?,?)", new Object[]{"张三", 4});
 
    db.execSQL("update person set name=? where personid=?", new Object[]{"李四", 1});
 
    db.setTransactionSuccessful(); // 标记事务完成
} 
finally
{
    db.endTransaction(); // 结束事务
    db.close();
}

没错就是同时做了两条操作。这样就能体现事务的作用了:只要这两条操作有一条出了异常db.setTransactionSuccessful()就不会执行了。到finally结束事务时,发现事务没有标记完成。就不提交而是回滚。

回滚 就是还原(加入我第一条操作成功了,而第二条操作异常了,但是要求是两条都成功才能去改数据库,如果没有回滚,第一条已经改了数据库了,而第二条的操作没起作用,岂不是智能去进行数据库操作才能补救了吗?这就有点太过坑爹了。不过如果回滚了,那么第一条修改的数据库那条数据就会还原为修改之前的状态了)

可能这样解释不太明白,以下是我从百度上找来的一段解释也是帮助了我理解的:

一组业务整体处理的行为叫一个事务。这一组的业务都能成功处理,我们就可以把这个事务提交来保存你已做的行为结果。但如果一组中有任何的差错出现的话,我们就认为这事务不成功,需要回滚来撤消之前的操作。举例:你去银行转账,转账我们有两步吧,从你账户中取出钱再往他账户中加钱。那这两步银行是必须要确保正确无误的进行的。要被看做成一个事务。其中任何一步出错就算是转账失败,但可能你这时是已经从你账户中扣了钱了,又没往他账户里加
钱?怎么办算了?你不肯吧。所以银行会事务回滚,不保存你刚才的操作,即恢复复到你没转账之前的状态。

猜你喜欢

转载自blog.csdn.net/h490516509/article/details/86605607