数据库事务有两个特点:安全性和高效性
事务(Transaction)是一个对数据库执行工作单元。事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成。
事务(Transaction)是指一个或多个更改数据库的扩展。例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务。重要的是要控制事务以确保数据的完整性和处理数据库错误。
实际上,您可以把许多的 SQLite 查询联合成一组,把所有这些放在一起作为事务的一部分进行执行。
事务的属性
事务(Transaction)具有以下四个标准属性,通常根据首字母缩写为 ACID:
-
原子性(Atomicity):确保工作单位内的所有操作都成功完成,否则,事务会在出现故障时终止,之前的操作也会回滚到以前的状态。
-
一致性(Consistency):确保数据库在成功提交的事务上正确地改变状态。
-
隔离性(Isolation):使事务操作相互独立和透明。
-
持久性(Durability):确保已提交事务的结果或效果在系统发生故障的情况下仍然存在。
1.安全性
情景:每个月15号发工资
操作流程:公司财务账户打款到个人账户15000。过程中出现问题。公司财务账户上已出款,但个人账户上未收到。
解决:使用数据库事务
解决流程:
public class DatabaseHelper extends SQLiteHelper{
public DatabaseHelper( Context context){
super(context, Constants.DB_NAME, null, 1);
}
@Override
public void onCreate( SQLiteDatabase db){
db.execSQL("create table account(_id integer, name varchar, money integer)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
}
}
然后在测试类里加载
public class TestDatabase extends AndroidTestCase{
public void testDatabase(){
// 测试数据库创建
DatabaseHelper mHelper = new DatabaseHelper(getContext());
mHelper.getWritableDatabase();
}
public void testInsert(){
// 测试数据插入
DatabaseHelper mHelper = new DatabaseHelper(getContext());
SQLiteDatabase db = mHelper.getWritableDatabase();
db.execSQL("insert into account values(1,'company',1000000)");
db.execSQL("insert into account values(2,'myAccount',0)");
db.close();
}
public void testUpdate(){
// 测试转账,公司账户减去15000,个人账户增加15000。
DatabaseHelper mHelper = new DatabaseHelper(getContext());
SQLiteDatabase db = mHelper.getWritableDatabase();
db.execSQL("update account set money = 1000000-15000 where name = 'company' ");
// 如果这里出现了异常,则公司账户里钱会减少,个人账户里钱不会到账。例如int i = 10/0;
db.execSQL("update account set money =15000 where name = 'myAccount' ");
db.close();
} // 故整段代码需要加以修改。通过数据库事务处理异常 。
--------------------------------------------------------------------------------------------------------------------------------------------------
public void testUpdate(){
// 测试转账,公司账户减去15000,个人账户增加15000。
DatabaseHelper mHelper = new DatabaseHelper(getContext());
SQLiteDatabase db = mHelper.getWritableDatabase();
db.beginTransaction();
try{
db.execSQL("update account set money = 1000000-15000 where name = 'company' ");
// 如果这里出现了异常,则公司账户里钱会减少,个人账户里钱不会到账。例如int i = 10/0;
db.execSQL("update account set money =15000 where name = 'myAccount' ");
db.setTransactionSuccessful(); // 标记事务完成,不可省略。
}catch(Exception e){
// 处理异常
throw new RuntimeException("系统故障!请稍后再试....");
}finally{
db.endTransaction();
db.close();
}
} // 发生异常,则里面数据不会变。
}
Attention:db.benginTransaction()、db.setTransactionSuccessful()、db.endTransaction()三者都需加上,缺一不可。
②高效性
1.使用普通的形式向数据库添加3000条数据。
2.使用事务的形式添加3000条数据。
使用方法即在插入部分前后分别加上db.beginTransaction()和db.endTransaction()。两种方法使用时间约为两个数量级。
1中打开数据库,插入数据,关闭数据库。
2中开启数据,把数据存到内存,然后一起写入。