数据库事物:执行一段逻辑 要么同时成功 要么同时失败
需求:张三给李四转账,点击转账,进行扣款
1,创建数据库表account,存有张三和李四的金额
public MyOpenHelper(Context context) {
super(context, "Account.db", null, 1);
}
//当数据库第一次创建的时候调用 特别适合做表结构的初始化
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table info (_id integer primary key autoincrement,name varchar(20),phone varchar(20),money varchar(20))");
db.execSQL("insert into info ('name','phone','money') values ('张三','138888','2000')");
db.execSQL("insert into info ('name','phone','money') values ('李四','139999','5000')");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2,点击转账 开启数据库事务
3,转账结束 结束事务
public class MainActivity extends Activity {
private MyOpenHelper myOpenHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myOpenHelper = new MyOpenHelper(getApplicationContext());
}
// 点击按钮进行转账的逻辑
public void click(View v) {
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
// 使用事物进行转账
db.beginTransaction(); // 开启事物
try {
// 实现转账的逻辑 实际上就写sql语句
db.execSQL("update info set money = money - 100 where name = ?",
new Object[] { "张三" });
int i = 10 / 0;
db.execSQL("update info set money = money + 100 where name = ?",
new Object[] { "李四" });
// 给当前事物设置一个成功的标记
db.setTransactionSuccessful();
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "服务器忙,请稍后再转", 1).show();
}
finally {
db.endTransaction(); // 关闭事物
}
}
}
网友评论